性能:Matlab 与 Python

2024-06-23

我最近从Matlab to Python。在转换我的一个冗长代码时,我惊讶地发现Python非常慢。我分析并追踪了一个函数占用时间的问题。该函数是从我的代码中的各个位置调用的(作为递归调用的其他函数的一部分)。探查器建议300两个地方都调用了这个函数Matlab and Python.

简而言之,以下代码总结了当前的问题:

MATLAB

包含函数的类:

classdef ExampleKernel1 < handle  
methods (Static)
    function [kernel] = kernel_2D(M,x,N,y) 
        kernel  = zeros(M,N);
        for i= 1 : M
            for j= 1 : N
                % Define the custom kernel function here
                kernel(i , j) = sqrt((x(i , 1) - y(j , 1)) .^ 2 + ...
                                (x(i , 2) - y(j , 2)) .^2 );             
            end
        end
    end
end
end

以及调用 test.m 的脚本:

xVec=[   
49.7030   78.9590
42.6730   11.1390
23.2790   89.6720
75.6050   25.5890
81.5820   53.2920
44.9680    2.7770
38.7890   78.9050
39.1570   33.6790
33.2640   54.7200
4.8060   44.3660
49.7030   78.9590
42.6730   11.1390
23.2790   89.6720
75.6050   25.5890
81.5820   53.2920
44.9680    2.7770
38.7890   78.9050
39.1570   33.6790
33.2640   54.7200
4.8060   44.3660
];
N=size(xVec,1);
kex1=ExampleKernel1;
tic
for i=1:300
    K=kex1.kernel_2D(N,xVec,N,xVec);
end
toc

给出输出

clear all
>> test
Elapsed time is 0.022426 seconds.
>> test
Elapsed time is 0.009852 seconds.

PYTHON 3.4

包含函数 CustomKernels.py 的类:

from numpy import zeros
from math import sqrt
class CustomKernels:
"""Class for defining the custom kernel functions"""
    @staticmethod
    def exampleKernelA(M, x, N, y):
        """Example kernel function A"""
        kernel = zeros([M, N])
        for i in range(0, M):
            for j in range(0, N):
                # Define the custom kernel function here
                kernel[i, j] = sqrt((x[i, 0] - y[j, 0]) ** 2 + (x[i, 1] - y[j, 1]) ** 2)
        return kernel

以及调用 test.py 的脚本:

import numpy as np
from CustomKernels import CustomKernels
from time import perf_counter

xVec = np.array([
    [49.7030,  78.9590],
    [42.6730,  11.1390],
    [23.2790,  89.6720],
    [75.6050,  25.5890],
    [81.5820,  53.2920],
    [44.9680,   2.7770],
    [38.7890,  78.9050],
    [39.1570,  33.6790],
    [33.2640,  54.7200],
    [4.8060 ,  44.3660],
    [49.7030,  78.9590],
    [42.6730,  11.1390],
    [23.2790,  89.6720],
    [75.6050,  25.5890],
    [81.5820,  53.2920],
    [44.9680,   2.7770],
    [38.7890,  78.9050],
    [39.1570,  33.6790],
    [33.2640,  54.7200],
    [4.8060 ,  44.3660]
    ])
N = xVec.shape[0]
kex1 = CustomKernels.exampleKernelA
start=perf_counter()
for i in range(0,300):
    K = kex1(N, xVec, N, xVec)
print(' %f secs' %(perf_counter()-start))

给出输出

%run test.py
 0.940515 secs
%run test.py
 0.884418 secs
%run test.py
 0.940239 secs

RESULTS

比较结果似乎Matlab在“”之后大约快 42 倍clear all" 被调用,如果脚本多次运行而不调用 ",那么速度会快 100 倍clear all“。这至少是一个数量级,如果不是快两个数量级的话。这对我来说是一个非常令人惊讶的结果。我原以为结果会是相反的。

有人可以解释一下吗?

有人可以建议一种更快的方法来执行此操作吗?

边注

我也尝试过使用numpy.sqrt这使得性能更差,因此我正在使用math.sqrt in Python.

EDIT

The for调用函数的循环纯粹是虚构的。他们只是为了“simulate" 300调用该函数。正如我之前所描述的,内核函数(kernel_2D in Matlab and kex1 in Python)是从程序中的各个不同位置调用的。为了让问题变得更短,我“simulate" the 300调用使用for环形。这for由于核矩阵的结构,核函数内部的循环是必要且不可避免的。

EDIT 2

这是更大的问题:https://github.com/drfahdsiddiqui/bbfmm2d-python https://github.com/drfahdsiddiqui/bbfmm2d-python


你想摆脱那些for循环。尝试这个:

def exampleKernelA(M, x, N, y):
    """Example kernel function A"""
    i, j = np.indices((N, M))
    # Define the custom kernel function here
    kernel[i, j] = np.sqrt((x[i, 0] - y[j, 0]) ** 2 + (x[i, 1] - y[j, 1]) ** 2)
    return kernel

您还可以通过广播来完成此操作,这可能会更快,但不太直观MATLAB.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

性能:Matlab 与 Python 的相关文章

随机推荐

  • Angularjs-ui bootstrap.tabs - 添加下一个选项卡按钮

    我正在使用模式来显示一系列选项卡 div class modal fade hide modal creator div class modal header h3 Create New Gallery h3 div div class m
  • 返回“IList”与“ICollection”与“Collection”

    我对应该从公共 API 方法和属性返回哪种集合类型感到困惑 我想到的收藏是IList ICollection and Collection 返回这些类型中的一种总是优于其他类型 还是取决于具体情况 ICollection
  • Travis-CI:docker 镜像作为构建环境

    In 特拉维斯 西尔是否可以从 docker 容器内部运行构建过程 In 亚搏体育appGitLab持续集成 http docs gitlab com ce ci docker using docker images html这是默认设置
  • 将更改存储在通过 getClass().getResourceAsStream 读取的 .properties 文件中

    我正在编写一个从 properties 文件读取属性的 java Web 应用程序 由于我不知道 properties 文件的绝对路径 因为它取决于应用程序将来运行的环境 所以我必须使用 getClass getResourceAsStre
  • Java 签名的小程序证书仅在 mac OSX10.7 (Lion) 上被吊销

    我有一个签名的小程序 可以在 Windows Mac security Loading certificates from Deployment session certificate store security Loaded certi
  • Jasmine/PhantomJs 规格运行程序

    我无法使用 phantomJs 运行测试 吞咽任务 var jasminePhantomJs require gulp jasmine2 phantomjs gulp task test function return gulp src S
  • 从流中获取文本阅读器?

    我正在尝试读取嵌入的文本文件System Reflection Assembly GetExecutingAssembly GetManifestResourceStream resource 但它给了我一个Stream 嵌入的资源是一个文
  • 如何在 Bash 脚本中回答“是”

    有一个快速的问题 想象一下我有这样的代码 mkdir p INSTALLDIR sudo apt get install y git clojure leiningen git clone git github com maltoe sto
  • 指令级并行性探索

    我只是想知道是否有任何有用的工具可以让我在某些算法中利用指令级并行性 更具体地说 我有一个子集 来自多媒体领域的算法 我想知道利用 ILP 的最佳方法是什么 在这个算法中 所有这些算法都是用 C 语言实现的 所以理想情况下 我将这些算法作为
  • Scala 将字符串转换为映射

    转换这个最快的方法是什么 a ab b cd c cd d de e ef f fg 进入 scala 中的可变映射 我从 500MB 文件中读取了这个输入字符串 这就是我关心速度的原因 如果您的 JSON 像您的示例一样简单 即一系列键
  • 将参数传递给 Scala 对象

    是否可以从外部对象初始化 Scala 对象 我尝试初始化的 Scala 对象没有任何 Companion 类 这是一个例子 object ObjectA val mongoDBConnectionURI This is the Val th
  • python 视频捕获循环

    我编写了一个简单的脚本来连续从网络摄像头捕获快照 我唯一的问题是视频捕获模块并不总是捕获图像 这反过来又导致程序崩溃 我认为我可以通过使用无限循环来解决这个问题 但我不确定如何解决 这是脚本 from VideoCapture import
  • 文件转换任务无法转换压缩包上的 XML 配置

    我正在开发发布管道 它将对应用程序服务工作线程配置执行转换 然后发布工作线程 Web 应用程序 我的输入包是由 MsBuild 发布 来自 ASP NET 构建管道 生成的 zip 包 PackageTmp app data jobs tr
  • Rails - 查找或创建 - 有查找或构建吗?

    我目前正在使用 XXX find or create by uuid XXXX 有没有办法进行查找或构建 Try XXX find or initialize by uuid XXXX
  • TypeScript 中的无渲染 Vue 组件

    我有一个 JavaScript 中的无渲染组件 我正在尝试将其转换为 TypeScript 我在声明时遇到错误render函数在一个Vue extend ed 组件 method ComponentOptions
  • 在 Python 中删除 root 权限

    我想让一个Python程序开始侦听端口80 但之后执行时无需root权限 有没有办法放弃 root 或在没有 root 的情况下获取端口 80 如果没有 root 权限 您将无法在端口 80 上打开服务器 这是对操作系统级别的限制 因此 唯
  • 如何在 C++ 中强制包含静态库中的静态对象 (MSVC 11)

    我试图在 C 文件中初始化一个静态对象 该文件试图在其构造函数中将类自动注册到工厂 就像任何标准自动注册问题一样 问题是 它被编译为静态库 并且在链接到可执行文件时被优化掉 应该有一个非常简单的解决方案 但令人惊讶的是 看起来并不那么简单
  • 如何在 Echo Alexa 卡片中显示超链接

    如何在 Echo Alexa 卡中显示超链接 即与 Echo 通话后在 Alexa 应用程序中显示的卡 我知道它包含在 lambda 函数返回的响应中 但找不到除https developer amazon com public solut
  • 如何重置 table.DefaultView.RowFilter?

    下面的代码工作正常并正确过滤行 但是我如何将表恢复到原始状态 DataTable table this dataGridView1 DataSource as DataTable table DefaultView RowFilter co
  • 性能:Matlab 与 Python

    我最近从Matlab to Python 在转换我的一个冗长代码时 我惊讶地发现Python非常慢 我分析并追踪了一个函数占用时间的问题 该函数是从我的代码中的各个位置调用的 作为递归调用的其他函数的一部分 探查器建议300两个地方都调用了