python - C 程序比 Python 子进程更快

标签 python c subprocess benchmarking

我有一个用 C 编写的多线程合并排序程序,以及一个使用 0、1、2 或 4 个线程对其进行基准测试的程序。我还用 Python 编写了一个程序来进行多项测试并汇总结果。

奇怪的是,当我运行 Python 时,与直接在 shell 中运行测试相比,测试的运行时间总是缩短一半左右。

例如,当我自己运行测试程序时,要对 400 万个整数进行排序(最后两个参数是生成整数的种子和模数):

$ ./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 脚本:

$ ./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 程序使用 subprocess 模块调用测试器,然后解析并聚合输出。为什么会发生这种情况的任何想法? Python 是否以某种方式优化了执行?或者当我直接运行它时是否有什么我不知道的东西减慢了它的速度?

代码:https://gist.github.com/2650009

最佳答案

原来我将 sys.maxint 传递给子进程作为生成随机数的模数。 C 正在截断 64 位整数并将其解释为带符号的,即二进制补码中的 -1,因此每个随机数都被它修改并变为 0。因此,对所有相同的值进行排序似乎需要大约一半的时间很多时间作为随机数据。

关于python - C 程序比 Python 子进程更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10524842/

相关文章:

python - BeautifulSoup - 仅当找到特定字符串时才在标签内获取文本

c++ - 子进程收到父进程的 SIGINT

python - 将列表传递给 subprocess.run

python - subprocess 会杀死子进程,但不会杀死子进程产生的进程

python - Pandas :计算两列的不同组合并添加到同一数据框

Python 2 - 你会如何向上/向下舍入到最近的 6 分钟?

c++ - 为什么 C 和 C++ 关键字 "#defined"或 "typedefed"也作为它们的大写版本?

python - 如何使用子进程交替目录

python - 我应该将什么 python 数据结构和解析器与 Apple 的 system_profiler 一起使用?

c - Hello World ,裸机 Beagleboard