我最近从切换Matlab
到Python
。在转换我冗长的代码之一时,我很惊讶地发现运行Python
速度很慢。我用一个耗时的功能来分析和跟踪问题。我的代码中的各个位置都正在调用此函数(是其他递归调用的函数的一部分)。Profiler建议在和中都对该函数进行
300次 调用。Matlab``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
结果
比较结果,似乎Matlab
在clear all
调用“ ”之后要快大约42倍,如果脚本多次运行而不调用“ clear all
”则要快100倍。如果不是两个数量级,则至少快一个数量级。这对我来说是非常令人惊讶的结果。我期望结果是相反的。
有人可以说明一下吗?
有人可以建议一种更快的方法来执行此操作吗?
边注
我也试图利用numpy.sqrt
这使得性能更差,因此我使用math.sqrt
在Python
。
编辑
for
调用函数的循环纯粹是虚构的。他们在那里只是为了“ 模拟 ”对该函数的 300个
调用。如前所述,内核函数(kernel_2D
inMatlab
和kex1
in
Python
)是从程序中的不同位置调用的。为了简化问题,我使用循环“ 模拟 ”了 300个
调用for
。该for
内核函数内部循环,因为核矩阵的结构是必要的,不可避免的。
编辑2
这是更大的问题: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
。
问题内容: 我正在计算稀疏自动编码器的算法。我已经使用和在python中实现了它。代码几乎相同,但是性能却大不相同。matlab完成任务所需的时间为0.252454秒,而numpy为0.973672151566,几乎是原来的四倍。在最小化问题中,我将在以后多次调用此代码,因此这种差异会导致实现之间的延迟几分钟。这是正常行为吗?如何提高numpy的性能? numpy实现: Sparse.rho是调整
本文向大家介绍MATLAB使用Profiler识别性能瓶颈,包括了MATLAB使用Profiler识别性能瓶颈的使用技巧和注意事项,需要的朋友参考一下 示例 MATLAB Profiler是用于对MATLAB代码进行软件配置的工具。使用探查器,可以获得执行时间和内存消耗的直观表示。 运行Profiler可以通过两种方式完成: .m在编辑器中打开一些文件(在R2012b中添加)时,单击MATLAB
概览 首先我们了解一下 YODAOS 的运行时:YODAOS 基于 ShadowNode 它采用事件驱动、非阻塞I/O模型;在设计之初,ShadowNode 的接口与 Node.js 兼容,因此在大部分场景下,开发者可以像 Node.js 一样使用 ShadowNode,了解这些有利于开发者更快速的进行 YODAOS 上的应用开发。 YODAOS 开发应用时,需要关注应用的性能与稳定性,包括但不限
问题内容: 在 createNamedNativeQuery 和 createNativeQuery 之间是否有任何与性能相关的功能,因为我们计划对HQL查询使用命名查询,并为本机SQL查询维护单独的查询文件。 问题答案: 命名本机查询 :此查询的范围是持久性上下文,可以通过指定其标识符在应用程序中使用。此后不能更改查询,它是静态的。它们在服务器启动时仅被验证一次(特定于JBoss) 本机查询 :
我们有一个本机< code>c/asm应用程序,它利用GPU(OpenCL)通过特定的方法对大量< code >数据进行加密/解密,它运行得非常完美,没有任何问题。该项目的一部分(网络和分发)正在由< code>JEE开发,我们只需要调用原生应用程序/库。 我们已经尝试使用类将其称为分离的外部进程。问题是我们无法控制应用程序(事件、处理程序、线程等…)。我们还尝试将C代码切换为Java代码,但性能
过早优化,往往引来各种麻烦。 一项技术究竟能否实用,有两项基本指标十分关键:一是功能的完备;一是性能的达标。 本章将试图对已有区块链技术进行一些评测。所有结果将尽可能保证客观准确,但不保证评测方法是否科学、评测结果是否具备足够参考性。