文章目录
- 起因
- 一、怎样尽快将matlab代码转成Python?
- 二、怎样尽量加快计算?
- 三. 一不小心矩阵太大内存爆了怎么办?
- 结尾
起因
进一阵子因为需要用python来跑一些matlab的代码,实际上python可以直接调用matlab代码(可以直接用matlab.engine包),不过当时弄了一阵子没弄明白参数的调用的逻辑,索性就将matlab代码转成Python了。
一、怎样尽快将matlab代码转成Python?
根据我所搜索到的信息,numpy库和matlab的操作近似,如果想尽快把matlab代码转成python代码并运行起来,使用numpy库会比较方便。不过要注意,numpy中两个矩阵相乘是元素对应相乘,比如说python代码C = A * B
相当于matlab代码C = A .* B
,如果想进行矩阵运算中的乘法,则需要用.dot来进行相乘,比如说python代码C = A.dot(B)
相当于matlab代码C = A * B
。
二、怎样尽量加快计算?
matlab在进行矩阵运算时,能够自动调用多个CPU,而Python正常情况下因为GIL锁,一般情况下只能调用1个CPU,就造成了运算上的瓶颈,这种情况下,解决方法有多种:
- numpy库的简单矩阵运算能够自动使用多个CPU(dot, +, -, *)因为其底层源码好像说是用C写的,不受python的GIL锁限制。
- 如果希望通过调用GPU的形式来进行并行运算,可以尝试cupy库,其中包装了和numpy、scipy同名的许多函数,用法相似,不过能在GPU上进行运算。
- 可以试一下使用python自带的multiprocessing(进程并行)调用多个CPU。我的理解是,将任务分成很多可以同时进行的进程,python的GIL锁限制一个不调用numpy的python进程只能用一个CPU,那我一个任务拆分成一堆进程,最后再将这些进程的结果进行汇总,也可以达到调用多个CPU的目的,不过注意,进程的建立和释放都是有开销的。
三. 一不小心矩阵太大内存爆了怎么办?
好像没什么特别简单的办法,我是直接将一个大矩阵划分成一个个小矩阵计算,最后再拼接出一个大矩阵,这种方式主要的作用是,至少避免中间生成的临时矩阵和原矩阵一样大。
结尾
有大佬有更好的方法的话希望可以在评论区分享一下~
更多推荐
matlab代码转python过程中的小记录
发布评论