Вот как ваше выражение читается с точки зрения компьютера.
[(0 if N < 2 else val * 2) for val in range(0, N // 2)]
Таким образом, бит for
происходит первым. И если N
меньше, чем 2
, то range(0, N // 2)
пусто, поэтому бит 0 if N < 2 else val * 2
фактически никогда не выполняется.
В вашем случае, было бы более разумно просто иметь два разных случая.
if N < 2:
return [0]
else:
return [val * 2 for val in range(0, N // 2)]
Или, если хотите, в одну строку,
[0] if N < 2 else [val * 2 for val in range(0, N // 2)]
Конечно. Если Ваше программное обеспечение делает частое использование диска или сети IO, можно часто улучшать пропускную способность путем добавления еще нескольких потоков. Те дополнительные потоки будут бодрствовать и выполнение материала, в то время как другие потоки блокируются на IO.
Другой говорили о ситуациях, в которых это почти наверняка имеет смысл (при выполнении любого довольно медленного IO).
Это не могла бы быть хорошая идея если:
и
В этом случае существует возможность порождения ненужных неудачных обращений в кэш.
Это может иметь смысл если
Ваши преимущества проектирования программы, в этом, у Вас есть параллельные задачи, которые лучше всего реализованы в потоках, или
некоторые Ваши потоки являются I/O-bound, таким образом, они не используют процессоры,/cores самостоятельно.
Короткий ответ - "да".
Даже мысль, Вы могли получить больше от многопоточности на многопроцессорной системе environement, это - все еще полезная технология на единственной машине процессора, главным образом потому что это означает делегирование некоторой работы к планировщику процесса у кого должна быть намного лучшая информация, чем Вы имеете.
Если Вы не мультираспараллелите, то Вы закончите тем, что делали задание планирования сами, которое могло быть хорошей вещью, если это - то, в чем Вы нуждаетесь, но по всей вероятности будете и утомительны и неэффективны
Каждый раз у Вас есть задача, ожидающая операции ввода-вывода, действительно имеет смысл включать его в поток и разжигать его. Существует большая вероятность, что Ваш поток будет приостановлен при ожидании операции ввода-вывода для окончания. Когда это добирается, просыпаются, результат будет ожидать его.
Поскольку вся современная ОС является много управлением задачами: каждый поток получает долю времени от процессора. Это не на самом деле параллельное выполнение, но, учитывая процессор может обработать тысячи запросов в секунду, это - "очевидное" параллельное выполнение.
Таким образом да, если случаю нужно, действительно имеет смысл мультираспараллеливать на единственном процессоре.
Одно из преимуществ - при обновлении аппаратных средств которые, вероятно, получат больше процессоров/ядер.
Я нашел, что при записи синтаксических анализаторов данных, которые обрабатывают большие наборы данных по сети, лучше создавать поток для каждой буквы алфавита (имеющий отношение к данным) и заставлять программу быть большим количеством ЦП и связанной памяти. Ограниченность ввода-вывода наследовалась с сетевыми и дисковыми операциями, главное узкое место, таким образом, можно также "начать" на других файлах данных вместо того, чтобы делать работу последовательно.
На четырехъядерном, конечно, имело бы смысл запускать больше чем четыре потока. Маловероятно, что те 4 потока были бы распространены через больше чем одно из ядер, особенно с сегодняшними скоростями процессора.