我有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倍以上
答案 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$