从Python调用MATLAB必然会导致一些性能降低,我可以通过重写Python中的(大量)代码来避免这些性能降低。然而,这对我来说并不是一个现实的选择,但是让我恼火的是效率的巨大损失在于从numpy数组到matlabdouble的简单转换。在
我说的是从data1到data1m的以下转换,其中
data1 = np.random.uniform(low = 0.0, high = 30000.0, size = (1000000,))
data1m = matlab.double(list(data1))
这里matlab.double来自Mathworks自己的MATLAB包/引擎。第二行代码在我的系统上花费了20秒,这对于一个除了让数字在MATLAB中“可食用”之外什么都不做的转换来说似乎太多了。在
所以基本上我在寻找一个与给定的here相反的技巧,它可以将MATLAB输出转换回Python。在
我的情况有点不同(python脚本从matlab调用),但是对于我来说,将ndarray转换为数组.array大大加快了进程。基本上它与Alexandre Chabot解决方案非常相似,但不需要更改任何文件:
至少如果从Matlab中完成数组.array“双”和“快”。用matlab2016b+python 3.5.4 64位进行测试。在
在等待更好的建议的同时,我将发布迄今为止我想出的最好的技巧。归根结底就是用`scipy.io.savemat,然后在MATLAB中加载此文件。在
这不是最漂亮的黑客,它需要一些小心,以确保依赖同一脚本的不同进程不会最终写入和加载彼此的.mat文件,但性能提高对我来说是值得的。在
作为一个测试用例,我编写了两个简单的、几乎完全相同的MATLAB函数,它们需要2个numpy数组(我测试的长度为1000000)和一个int作为输入。在
函数
test
需要转换,而test2
需要保存。在测试
test
:转换两个numpy数组需要cirka40s。准备和运行测试的总时间为170 s测试
test2
:保存数组和int在我的系统上需要cirka 0.35秒。令人惊讶的是,在MATLAB中加载.mat文件是非常有效的(或者更令人惊讶的是,它在处理它的双精度函数时非常不熟练)。。。准备和运行test2的总时间为0.38 s性能提高了近450倍。。。在
在 高效传递numpy数组
查看文件夹
PYTHONPATH\Lib\site-packages\matlab\_internal
中的文件mlarray_sequence.py
。在这里您将找到MATLAB数组对象的构造。性能问题来自于在generic_flattening
函数中使用循环复制数据。在为了避免这种行为,我们将对文件进行一点编辑。此修复程序应该适用于复杂和非复杂的数据类型。在
import numpy as np
添加到文件开头的其他导入中在第38行中,您可以找到:
在第48行中,您可以找到:
现在可以将numpy数组直接传递给MATLAB数组创建方法。在
MATLAB数组创建的性能提高了15倍,而且接口现在更易于使用。在
相关问题 更多 >
编程相关推荐