Вот такой тест ... это 1-е грубое приближение что получилось:Olej писал(а):Нужно это обязательно проверить на последних версиях, что там происходит!
Код: Выделить всё
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
import sys
import getopt
import string
import threading
import os
def ncount( n ) : # тестовая CPU-загружающая функция
while n > 0 : n -= 1
repnum = 10000000
thrnum = 2
mode = 'stp'
try :
opts, args = getopt.getopt( sys.argv[1:], "t:n:m:" )
except getopt.GetoptError :
print "недопустимая опция команды или её значение"
sys.exit( 2 )
for opt, arg in opts :
if cmp( opt[ 1: ], 't' ) == 0 : thrnum = string.atoi( arg )
if cmp( opt[ 1: ], 'n' ) == 0 : repnum = string.atoi( arg )
if cmp( opt[ 1: ], 'm' ) == 0 : mode = arg
print "число выполнений %i" % thrnum
print "число циклов в выполнении %i" % repnum
if 's' in mode :
print "============ последовательное выполнение ============"
clc = time.time()
for i in range( thrnum ) : ncount( repnum )
clc = time.time() - clc
print "время %5.2f секунд" % clc
if 't' in mode :
print "================ параллельные потоки ================"
threads = []
for n in range( thrnum ) :
tid = threading.Thread( target = ncount, args=( repnum, ) )
threads.append( tid )
tid.setDaemon( 1 )
clc = time.time()
for n in range( thrnum ) : threads[ n ].start()
for n in range( thrnum ) : threads[ n ].join()
clc = time.time() - clc
print "время %5.2f секунд" % clc
if 'p' in mode :
print "================ параллельные процессы ================"
threads = []
clc = time.time()
for n in range( thrnum ) :
try : pid = os.fork();
except :
print "error: create child process"
sys.exit( 33 )
if pid == 0 :
ncount( repnum )
sys.exit( 3 )
if pid > 0 :
threads.append( pid )
for p in threads :
pid, status = os.wait()
clc = time.time() - clc
print "время %5.2f секунд" % clc
- последовательное выполнение (значение -m s) серии испытаний (число таких испытаний - опция -t);
- выполнение той же серии в несколько параллельных потоков (значение -m t);
- выполнение той же серии в несколько параллельных прочессов (значение -m p);
Опцией -n можно изменять объём "работы" (тупых циклов) в единичном испытании.
Если никакие опции не указывать (они больше для отладки), то число циклов = 10000000, число ветвей (испытаний) = 2, а испытания одно за другим проделываются все: последовательное выполнение, потоки, процессы...
И вот что имеем - для тех, кто понимает вкус в подобных извращениях, это очень любопытный результат!:
Код: Выделить всё
bash-4.2$ cat /proc/cpuinfo | grep ^processor
processor : 0
processor : 1
Код: Выделить всё
bash-4.2$ python -V
Python 2.7.3
Код: Выделить всё
bash-4.2$ ./mthrs.py
число выполнений 2
число циклов в выполнении 10000000
============ последовательное выполнение ============
время 2.89 секунд
================ параллельные потоки ================
время 3.46 секунд
================ параллельные процессы ================
время 2.06 секунд
Код: Выделить всё
bash-4.2$ ./mthrs.py -t5
число выполнений 5
число циклов в выполнении 10000000
============ последовательное выполнение ============
время 7.26 секунд
================ параллельные потоки ================
время 9.99 секунд
================ параллельные процессы ================
время 4.77 секунд
Но общий итог показанного остаётся тем же:
- при выполнении на 2-х процессорах задачи в 2 потока, общее время выполнения не уменьшается, а увеличивается по сравнению с тем, если эту же работу выполнить последовательно 2 раза один за другим;
- а вот распараллелив загрузку CPU средствами операционной системы, когда работает независимо 2 интерпретатора Python, выполняющих каждый свою задачу - вот здесь можно получить экономию за счёт 2-х процессоров;