C быстрее, чем подпроцесс Python

У меня есть многопоточная программа слияния в C, а также программа для тестирования тестов с потоками 0, 1, 2 или 4. Я также написал программу на Python, чтобы выполнить несколько тестов и обобщить результаты.

Странно то, что когда я запускаю Python, тесты всегда работают примерно в половине случаев по сравнению с тем, когда я запускаю их непосредственно в оболочке.

Например, когда я запускаю программу тестирования сам по себе с 4 миллионами целых чисел для сортировки (последние два аргумента являются семенем и модулем для генерации целых чисел):

$ ./mergetest 4000000 4194819 140810581084
0 threads:  1.483485s wall;  1.476092s user;  0.004001s sys
1 threads:  1.489206s wall;  1.488093s user;  0.000000s sys
2 threads:  0.854119s wall;  1.608100s user;  0.008000s sys
4 threads:  0.673286s wall;  2.224139s user;  0.024002s sys

Использование python script:

$ ./mergedata.py 1 4000000
Average runtime for 1 runs with 4000000 items each:
0 threads:   0.677512s wall;   0.664041s user;   0.016001s sys
1 threads:   0.709118s wall;   0.704044s user;   0.004001s sys
2 threads:   0.414058s wall;   0.752047s user;   0.028001s sys
4 threads:   0.373708s wall;    1.24008s user;   0.024002s sys

Это происходит независимо от того, сколько я сортирую, или сколько раз я запускаю его. Программа python вызывает тестер с модулем подпроцесса, затем анализирует и агрегирует результат. Любые идеи, почему это произойдет? Является ли Python каким-то образом оптимизацией исполнения? или что-то замедляет его, когда я запускаю его напрямую, о котором я не знаю?

Код: https://gist.github.com/2650009

Ответ 1

Оказывается, я передавал sys.maxint подпроцессу в качестве модуля для генерации случайных чисел. C усекал 64-битное целое число и интерпретировал его как подписанное, т.е. -1 в двух дополнениях, поэтому каждое случайное число менялось и становилось равным 0. Таким образом, сортировка всех одинаковых значений, по-видимому, занимает около половины много времени как случайные данные.

Ответ 2

обертка этого в оболочке script, вероятно, будет иметь тот же эффект. если это так, консольные операции