2014-02-26 42 views
1

所以我正在研究一个Matlab应用程序,它必须与Python脚本进行一些通信。被调用的脚本是一个简单的客户端软件。作为一个方面说明,如果有可能有一个Matlab客户端和一个Python服务器通信,这将完全解决这个问题,但我还没有找到一种方法来解决这个问题。matlab最佳的Python通信方式

总之,在网上搜索,我发现两种方法来调用Python脚本,或者由system()命令或编辑perl.m文件来调用Python脚本,而不是之后。这两种方式的速度都很慢(tic将它们强制为> 20ms,并且运行速度必须高于6ms),因为此调用将处于非常时间敏感的循环中。

作为一个解决方案,我想我可以在某个位置保存一个文件,让我的Python脚本不断检查这个文件,并在找到它时执行我想要的命令。现在,在对每个步骤进行计时并总结之后,我发现它的速度非常快(接近100倍,因此速度足够快),我无法真正相信这一点,或者说我不明白为什么调用python脚本的速度如此之慢(而不是我对这个问题不仅有肤浅的认识)。我还发现这个解决方案非常混乱和丑陋,所以只想检查一下,首先,这是一个好主意,其次,还有更好的方法吗?

最后,我意识到,Python time.time()和Matlab tic,toc可能不够精确,以衡量时间正确的规模,这也是我问为什么。

+0

你是说[地位,cmdout] =系统(“蟒蛇pyscript.py”)需要20毫秒,但保存(“flagfile.txt”)和那么从deamon python进程读取输出需要0.2ms? 你甚至在第二种情况下('cmdout')如何获得python进程的输出? 为什么后者更快的猜测是python进程已经启动,而在第一种情况下,你需要启动一个进程,加载python interpreter等。 我会研究使用命名管道(on * nix ),尽管matlab似乎并不太容易。 –

+0

抓住上面关于matlab +命名管道的负面评论,你可以在命名管道上使用fopen,fscanf等,所以现在你只需要在python端打开相应的管道,然后拿出一个适当的通信协议为输出 –

+0

谢谢,我用命名管道,足够好的解决方案,并确保足够快。 – jakelamotta

回答

1

抛开Python解释器的新实例需要一段时间。如果您翻译一次翻译,然后重复使用,那么这笔费用只支付一次,而不是每次都支付。

这是正常的(预期)行为,因为启动包括大量的分配和导入。例如,我的机器上,启动时间为:

$ time python -c 'import sys' 

real 0m0.034s 
user 0m0.022s 
sys  0m0.011s