Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 18, 2018 14:58:13

Pironity
Зарегистрирован: 2018-02-18
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Не понял многопоточность (threading)

Привет всем.
Имеются:

 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
Я не правильно понял, что такое многопоточность (ожидал использования 1+ потока процессора и, как следствие, ускорения выполнения задач), или я неверно написал код?

Отредактировано Pironity (Фев. 18, 2018 14:58:36)

Офлайн

#2 Фев. 18, 2018 16:14:17

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Не понял многопоточность (threading)

Почитайте что такое в питоне GIL и тогда все прояснится почему вы не достигли желаемого (код правильный).
Но если вы по прежнему хотите распараллелить это - то используйте multiprocessing - там интерфейс вызовов (насколько помню) схожий - минимум кода поменять.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Фев. 18, 2018 16:51:45

Pironity
Зарегистрирован: 2018-02-18
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Не понял многопоточность (threading)

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
Лучше, конечно, но все равно медленнее. Может быть я не с той стороны подхожу к проблеме? Если мне нужно ускорение выполнения кода при работе с большими объемами данных, возможно есть другие модули и библиотеки? Единственное, я пробовал pypy, но он оказался медленнее чем python.

Офлайн

#4 Фев. 18, 2018 17:59:40

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Не понял многопоточность (threading)

Pironity
Может быть я не с той стороны подхожу к проблеме? Если мне нужно ускорение выполнения кода при работе с большими объемами данных,
Вероятно. А как вы себе вообще представляете увеличение производительности распараллеливанием задач? Ну правда, процессор то один, и поэтому только один поток кода может выполняться в единицу времени.



Офлайн

#5 Фев. 18, 2018 18:09:19

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Не понял многопоточность (threading)

1. попробуй без print
2. numpy, scipy

Офлайн

#6 Фев. 18, 2018 18:09:50

Pironity
Зарегистрирован: 2018-02-18
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Не понял многопоточность (threading)


FishHook
А как вы себе вообще представляете увеличение производительности распараллеливанием задач?
Весьма отдаленно. Для меня выглядит так. У моего цпу 8 потоков. При выполнении кода задействован всего 1 на 100%. Если создать правильно распределение и задействовать больше 1 потока, в т.ч. все 8, скорость выполнения вырастет. Не в 8 раз, конечно, но ощутимо. Иначе какой смысл от многопоточных процессоров. Я не прав?

Офлайн

#7 Фев. 18, 2018 18:13:51

Pironity
Зарегистрирован: 2018-02-18
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Не понял многопоточность (threading)

vic57
попробуй без print
Это всего лишь пример, чтобы мои портянки не выкладывать. В реальных задачах в основном заполняются файлы или таблицы. Но там та же тенденция.
vic57
numpy, scipy
Не совсем понял, как эти расширения помогут. Судя по описанию, они добавляют многомерные массивы и сложные мат.вычисления с этими массивами. У меня такого и в помине нет.

Офлайн

#8 Фев. 18, 2018 18:14:20

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Не понял многопоточность (threading)

Pironity
У моего цпу 8 потоков.
у вашего ЦПУ вообще нет никаких потоков



Офлайн

#9 Фев. 18, 2018 18:16:31

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Не понял многопоточность (threading)

Pironity
Я не прав?
Вы категоричесмки не правы.
Что делать? Читатиь литературу. Таненбаум для начала пойдет.



Офлайн

#10 Фев. 18, 2018 18:17:03

Pironity
Зарегистрирован: 2018-02-18
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Не понял многопоточность (threading)

FishHook
у вашего ЦПУ вообще нет никаких потоков

https://habrahabr.ru/company/intel/blog/243385/

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version