Форум сайта python.su
Привет всем.
Имеются:
def first(num): if num % 2 == 0: return True return False def second(num): if num * 3 <= 100000: return True return False def main(): listNums = [i for i in range(1,100000)] for nums in listNums: if first(nums) and second(nums): print(nums) if __name__ == "__main__": main()
from threading import Thread def first(num): if num % 2 == 0: return True return False def second(num): if num * 3 <= 100000: return True return False def main(): listNums = [i for i in range(1,100000)] for nums in listNums: t1 = Thread(target=first, args=(nums,)) t2 = Thread(target=second, args=(nums,)) t1.start() t2.start() if first(nums) and second(nums): print(nums) if __name__ == "__main__": main()
time python no-threading
real 0m0.062s
user 0m0.035s
sys 0m0.023s
time python threading
real 0m6.383s
user 0m5.420s
sys 0m3.077s
Отредактировано Pironity (Фев. 18, 2018 14:58:36)
Офлайн
Почитайте что такое в питоне GIL и тогда все прояснится почему вы не достигли желаемого (код правильный).
Но если вы по прежнему хотите распараллелить это - то используйте multiprocessing - там интерфейс вызовов (насколько помню) схожий - минимум кода поменять.
Офлайн
JOHN_16
за подсказку про GIL спасибо. Не знал, что все так плохо…
По поводу мультипроцессинга, изменил код на:
from multiprocessing import Process def first(num): if num % 2 == 0: return True return False def second(num): if num * 3 <= 100000: return True return False def main(): listNums = [i for i in range(1,100000)] for nums in listNums: t1 = Process(target=first, args=(nums,)) t2 = Process(target=second, args=(nums,)) if first(nums) and second(nums): print(nums) if __name__ == "__main__": main()
real 0m0.687s
user 0m0.641s
sys 0m0.044s
Офлайн
PironityВероятно. А как вы себе вообще представляете увеличение производительности распараллеливанием задач? Ну правда, процессор то один, и поэтому только один поток кода может выполняться в единицу времени.
Может быть я не с той стороны подхожу к проблеме? Если мне нужно ускорение выполнения кода при работе с большими объемами данных,
Офлайн
1. попробуй без print
2. numpy, scipy
Офлайн
FishHookВесьма отдаленно. Для меня выглядит так. У моего цпу 8 потоков. При выполнении кода задействован всего 1 на 100%. Если создать правильно распределение и задействовать больше 1 потока, в т.ч. все 8, скорость выполнения вырастет. Не в 8 раз, конечно, но ощутимо. Иначе какой смысл от многопоточных процессоров. Я не прав?
А как вы себе вообще представляете увеличение производительности распараллеливанием задач?
Офлайн
vic57Это всего лишь пример, чтобы мои портянки не выкладывать. В реальных задачах в основном заполняются файлы или таблицы. Но там та же тенденция.
попробуй без print
vic57Не совсем понял, как эти расширения помогут. Судя по описанию, они добавляют многомерные массивы и сложные мат.вычисления с этими массивами. У меня такого и в помине нет.
numpy, scipy
Офлайн
Pironityу вашего ЦПУ вообще нет никаких потоков
У моего цпу 8 потоков.
Офлайн
PironityВы категоричесмки не правы.
Я не прав?
Офлайн
Офлайн