文章目录

  • 起因
  • 一、怎样尽快将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,就造成了运算上的瓶颈,这种情况下,解决方法有多种:

  1. numpy库的简单矩阵运算能够自动使用多个CPU(dot, +, -, *)因为其底层源码好像说是用C写的,不受python的GIL锁限制。
  2. 如果希望通过调用GPU的形式来进行并行运算,可以尝试cupy库,其中包装了和numpy、scipy同名的许多函数,用法相似,不过能在GPU上进行运算。
  3. 可以试一下使用python自带的multiprocessing(进程并行)调用多个CPU。我的理解是,将任务分成很多可以同时进行的进程,python的GIL锁限制一个不调用numpy的python进程只能用一个CPU,那我一个任务拆分成一堆进程,最后再将这些进程的结果进行汇总,也可以达到调用多个CPU的目的,不过注意,进程的建立和释放都是有开销的。

三. 一不小心矩阵太大内存爆了怎么办?

好像没什么特别简单的办法,我是直接将一个大矩阵划分成一个个小矩阵计算,最后再拼接出一个大矩阵,这种方式主要的作用是,至少避免中间生成的临时矩阵和原矩阵一样大。

结尾

有大佬有更好的方法的话希望可以在评论区分享一下~

更多推荐

matlab代码转python过程中的小记录