与c ++相比,为什么python中的系统调用速度要慢得多?

时间:2014-09-03 16:00:39

标签: python c++

我有2个代码在完成相同任务的意义上是相同的。一个代码是用python编写的,另一个是用c ++编写的。所有代码都是调用可执行文件(可执行文件生成ascii文件)。在c ++中,我使用system()命令来调用可执行文件。在python中,我使用了很多东西,包括os.system subprocess.call subprocess.popen

我意识到c ++是一种编译语言,而python则被解释。我也意识到python调用有更多的开销。但是c ++代码比python代码快了近100倍。 c ++时间约为0.004秒。蟒蛇时间大概是0.35秒。

即使简单的pwd命令使用python的时间比使用c ++的时间长10倍以上。如果开销正在减慢python代码的速度,那么python中的选项是否比我已经尝试过的更快?

这是一个简单的python代码:

from os import system
from time import time

t0 = time();
system("pwd");
print "duration: ",time()-t0;

以及c ++中的相同内容:

#include <iostream>
#include <sys/time.h>
double diff(timespec start, timespec end) { return (end.tv_nsec-start.tv_nsec)/1e9; }

int main()
{
    timespec t0, t1;
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, & t0);
    system("pwd");
    clock_gettime(CLOCK_PROCESS_CPUTIME_ID, & t1);

    std::cout << "duration: " << diff(t0,t1) << "\n";

    return 0;
}

我使用gcc编译c ++代码。你必须使用-lrt选项来获取正确编译的代码。

您可以自己运行代码。我的计时方法可能是错的。但如果它们没问题,那么与c ++可执行文件相比,python脚本执行pwd命令的时间要长10倍以上

3 个答案:

答案 0 :(得分:1)

C&#39; exec&#39; call直接执行程序。

虽然Python&#39;系统&#39; call首先执行bash,执行有问题的程序。

答案 1 :(得分:1)

您可以直接在python中使用execvp

import os

binary = "ls"
options = [binary, "-l"]

newpid = os.fork()
if newpid == 0:
     # we are in the child process
     os.execvp(binary, options)
     os._exit(1)

os.wait()
print "executed", " ".join(options)

答案 2 :(得分:1)

我制作了一个小脚本,执行时间比你看到的要快得多。

td@timsworld2:~/tmp/so$ cat nothing.py
#!/usr/bin/env python
import subprocess
import sys

cmd = ['python', '-V'] if 'py' in sys.argv else ['pwd']
if 'shell' in sys.argv:
    subprocess.call(' '.join(cmd), shell=True)
else:
    subprocess.call(cmd)


td@timsworld2:~/tmp/so$ time ./nothing.py
/home/td/tmp/so

real    0m0.024s
user    0m0.012s
sys     0m0.008s
td@timsworld2:~/tmp/so$ time python nothing.py
/home/td/tmp/so

real    0m0.020s
user    0m0.012s
sys     0m0.004s
td@timsworld2:~/tmp/so$ time ./nothing.py py
Python 2.7.3

real    0m0.022s
user    0m0.016s
sys     0m0.000s
td@timsworld2:~/tmp/so$ time ./nothing.py sh
/home/td/tmp/so

real    0m0.020s
user    0m0.012s
sys     0m0.004s
td@timsworld2:~/tmp/so$