gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 18:12:35 27 4
gpt4 key购买 nike

我有一个用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com