如何解决子进程效率在python中解释
我在这里询问 Python 子进程的效率。
我正在尝试创建一个需要能够执行其他语言代码的程序。 例如,假设我需要运行 js 文件(所以我会使用节点解释器)
我正在使用一个简单的代码(基于我之前问过的一个问题,关于 Kotlin ProcessBuilder vs python),我不明白为什么用命令行调用 py
和调用 cmd
会使时差差10倍
import subprocess
from time import perf_counter_ns
started = 0
completed = 0
def call():
process = subprocess.Popen(["node","printHello.js"],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,universal_newlines=True)
process.wait()
for i in range(0,1000):
if (i % 20 == 0):
print("Turn ",i)
start = perf_counter_ns()
call()
started += (perf_counter_ns() - start)
completed += (perf_counter_ns() - start)
print("Average time (ms) to start a process: ",started * 1e-9)
print("Average time (ms) to complete a process: ",completed * 1e-9)
打印结果(没有烦人的“Turn: xxx”)
启动进程的平均时间(毫秒):47.2123976
完成一个过程的平均时间(毫秒):47.2141487
代码 2
import subprocess
from time import perf_counter_ns
started = 0
completed = 0
def call():
process = subprocess.Popen(["cmd","/c","dir"],completed * 1e-9)
打印结果(没有烦人的“Turn: xxx”)
启动进程的平均时间 (ms):5.566161500000001
完成一个过程的平均时间(毫秒):5.5675167000000005
现在,这是一个很大的不同,我知道这些不是相同的命令,1 使用 os 一个是解释,但为什么解释慢这么多? 有没有人知道为什么它这么慢,有没有办法让它更快? 我已经搜索并发现了 pypy,它应该可以加速性能,但它并没有像我想要的那样成功。我知道这可以使它更快(或者至少是使用 Python 2.7),因为我曾经使用一个脚本来做到这一点。没有写那个脚本的代码,所以我不知道它为什么在那里工作,我发现的唯一线索是它使用了 psyco。
所以我的问题是:
- Python 使用命令
console.log("hello")
调用节点解释器不应该比我获得的结果更快吗? (我的电脑很好,不是那样) - 无论如何都可以通过 node 或 java 等子进程(使用子进程或任何其他模块)来提高调用解释器/编译器的性能
谢谢:)
解决方法
所以经过更多研究后,我发现了为什么我看到的代码运行良好而我的却没有。
正如 Charles Duffy 所说,打开许多子进程很繁重。 代码中的解决方案是使用一个线程来启动 1 个子进程,它只会接收许多输入,而不是多次调用同一个子进程。傻我...愚蠢的简单,谢谢你的帮助!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。