Производительность Python Threading против количества ядер

Я новичок в python и изучаю многопоточность и GIL. Это статистика командыlscpu:

 Architecture:          x86_64
 CPU op-mode(s):        32-bit, 64-bit
 Byte Order:            Little Endian
 CPU(s):                4
 On-line CPU(s) list:   0-3
 Thread(s) per core:    2
 Core(s) per socket:    2
 Socket(s):             1
 NUMA node(s):          1
 Vendor ID:             GenuineIntel
 CPU family:            6
 Model:                 69
 Stepping:              1
 CPU MHz:               1700.062
 BogoMIPS:              4789.05
 Virtualization:        VT-x
 L1d cache:             32K
 L1i cache:             32K
 L2 cache:              256K
 L3 cache:              3072K
 NUMA node0 CPU(s):     0-3

Когда я запустил этот простой пример потоковой обработки Python, я получил следующий вывод.

import time
import threading

def counter(n):
    for i in range(0,n):
        i = i+1
    return

t1 = threading.Thread(target=counter, args = (10000000,))
t2 = threading.Thread(target=counter, args = (10000000,))

t0 = time.clock()
t1.start()
t2.start()
t1.join()
t2.join()
t3 = time.clock()

print "Total time : %s"%str(t3-t0)

bash@bash:~/Desktop$ python threads.py
Total time : 2.115326

Но когда я отключу 3 ядра и перезапущу код:

bash@bash:~/Desktop$ python threads.py
Total time : 1.115442

Эти цифры остаются более или менее неизменными. Почему это так?? Кто-нибудь объясните. Заранее спасибо...


person 2rd_7    schedule 23.05.2016    source источник


Ответы (1)


Используемая вами библиотека потоков на самом деле не использует несколько ядер одновременно для вычислений.

Попробуйте использовать модуль multiprocessing вместо вычислительной потоковой обработки, вы должны увидеть больше "ожидаемых" результатов. полученные результаты.

person Sash Sinha    schedule 23.05.2016
comment
И помните о таких вещах, как динамическое масштабирование частоты (TurboBoost и т. д.) - person renefritze; 23.05.2016
comment
multiprocessing не использует потоки, это пакет, который поддерживает порождающие процессы [так в оригинале], что не совсем то же самое. - person Ilja Everilä; 23.05.2016
comment
Спасибо за ответ, но я хотел бы знать, почему он тормозит, когда число активных ядер больше. - person 2rd_7; 23.05.2016