На моей машине с Windows 7 я использую две реализации CPython:
1) дистрибутив WinPython, скомпилированный с помощью MSC v.1500 64bit.
2) MinGW-сборки, который скомпилирован с MinGW/GCC 4.9.1 64bit
Я попробовал версию, созданную MinGW, для компиляции некоторых расширений C для Python, которые должны быть собраны с помощью того же компилятора, что и сам Python для правильной работы.
Теперь рассмотрим следующий тестовый скрипт, который генерирует случайный словарь и многократно соленья и рассолы его.
import pickle, cPickle, random
from time import clock
def timeit(mdl, d, num=100, bestof=10):
times = []
for _ in range(bestof):
start = clock()
for _ in range(num):
mdl.loads(mdl.dumps(d))
times.append(clock() - start)
return min(times)
def gen_dict(entries=100, keylength=5):
formatstr = "{:0%dx}" % keylength
d = {}
for _ in range(entries):
rn = random.randrange(16**keylength) # 'keylength'-digit hex number
# format into string of length 5 as key, decimal value as value
d[formatstr.format(rn)] = rn
return d
def main(entries=100, keylength=5, num=100, bestof=10):
print "Dict size: %d entries, keylength: %d" % (entries, keylength)
print ("Test is %d times pack/unpack. "
"Take best time out of %d runs\n" % (num, bestof))
d = gen_dict(entries, keylength)
for mdl in [pickle, cPickle]:
print "%s: %f s" % (mdl.__name__, timeit(mdl, d, num, bestof))
if __name__ == "__main__":
main()
MSC CPython дал мне
Dict size: 100 entries, keylength: 5
Test is 100 times pack/unpack. Take best time out of 10 runs
pickle: 0.107798 s
cPickle: 0.011802 s
и MinGW/GCC CPython дал мне
Dict size: 100 entries, keylength: 5
Test is 100 times pack/unpack. Take best time out of 10 runs
pickle: 0.103065 s
cPickle: 0.075507 s
Таким образом, модуль cPickle (расширение стандартной библиотеки C для Python) работает на MinGW в 6,4 раза медленнее, чем на MSC.
Я не проводил дальнейших исследований (т.е. не тестировал больше расширений C), но я очень удивлен.
Так ли это? этого следовало ожидать?
Будут ли другие расширения C работать медленнее в цепочке инструментов Python/MinGW?