Shiza попросил меня сравнить питоньи (CPython) нити с PyQt'шными. Я написал тест.
# -*- coding: utf-8 -*-
import timeit
def test_func():
"""Тестовая функция."""
x = 1000000
while x > 0:
x -= 1
import threading
def python_thread_test(threads_num=3, test_func=test_func):
"""Тестируем питоньи нити."""
class Thread(threading.Thread):
def run(self):
test_func()
threads = []
for _ in xrange(threads_num):
threads.append(Thread())
for thread in threads:
thread.start()
for thread in threads:
thread.join()
timer = timeit.Timer('python_thread_test(3)',
'from __main__ import python_thread_test')
print "Python: %.2f" % timer.timeit(10)
del timer
del threading
del python_thread_test
from PyQt4 import QtCore
app = QtCore.QCoreApplication([])
def PyQt4_thread_test(threads_num=3, test_func=test_func):
"""Тестируем КьюТэшные нити."""
class Thread(QtCore.QThread):
def run(self):
test_func()
threads = []
for _ in xrange(threads_num):
threads.append(Thread())
for thread in threads:
thread.start()
for thread in threads:
thread.wait()
timer = timeit.Timer('PyQt4_thread_test(3)',
'from __main__ import PyQt4_thread_test')
print "PyQt4: %.2f" % timer.timeit(10)
STDOUTПока всё в порядке, но в процессе “игры” с кодом я изменил первый тест:
Python: 5.98
PyQt4: 5.42
# -*- coding: utf-8 -*-
import timeit
def test_func():
"""Тестовая функция."""
x = 1000000
while x > 0:
x -= 1
from threading import Thread
def python_thread_test(threads_num=3, test_func=test_func):
"""Тестируем питоньи нити."""
threads = []
for _ in xrange(threads_num):
threads.append(Thread(target=test_func))
for thread in threads:
thread.start()
for thread in threads:
thread.join()
timer = timeit.Timer('python_thread_test(3)',
'from __main__ import python_thread_test')
print "Python: %.2f" % timer.timeit(10)
del timer
del Thread
del python_thread_test
from PyQt4 import QtCore
app = QtCore.QCoreApplication([])
def PyQt4_thread_test(threads_num=3, test_func=test_func):
"""Тестируем КьюТэшные нити."""
class Thread(QtCore.QThread):
def run(self):
test_func()
threads = []
for _ in xrange(threads_num):
threads.append(Thread())
for thread in threads:
thread.start()
for thread in threads:
thread.wait()
timer = timeit.Timer('PyQt4_thread_test(3)',
'from __main__ import PyQt4_thread_test')
print "PyQt4: %.2f" % timer.timeit(10)
STDOUTЕщё раз обращаю ваше внимание на то, что был изменён только первый тест.
Python: 7.17
PyQt4: 7.27
Но какого чёрта он так повлиял на второй?
P.S. Всё это просто академический интерес, но если кто-нить знает, куда копнуть…