Cython 似乎通过减少时间分析器而不是核心代码的开销来提供加速?

     2023-03-06     178

关键词:

【中文标题】Cython 似乎通过减少时间分析器而不是核心代码的开销来提供加速?【英文标题】:Cython seems to provide speed-up by reducing the overhead in time profiler rather than the core code? 【发布时间】:2018-03-14 23:57:32 【问题描述】:

我试图学习和使用 cython 来加速我的个人项目,但我发现了一些奇怪的东西。

例子:

尝试http://nealhughes.net/cython1/的rbf_network示例

import pyximport; pyximport.install()
from src.test_cython import rbf_network  # File1: /src/test_cython.pyx
# from src.test import rbf_network       # File2: /src/test.py
import time
import cProfile
import numpy as np

def fun():
    D = 5
    N = 1000
    X = np.array([np.random.rand(N) for d in range(D)]).T
    beta = np.random.rand(N)
    theta = 10
    rbf_network(X, beta, theta)

# With CProfile
cProfile.run('fun()', sort='cumtime')

# Without Cprofile
start = time.time()
fun()
print("Time without CProfile: ", time.time() - start)

File1 和 File2 都包含:

from math import exp
import numpy as np

def rbf_network(X, beta, theta):

    N = X.shape[0]
    D = X.shape[1]
    Y = np.zeros(N)

    for i in range(N):
        for j in range(N):
            r = 0
            for d in range(D):
                r += (X[j, d] - X[i, d]) ** 2
            r = r**0.5
            Y[i] += beta[j] * exp(-(r * theta)**2)

    return Y

File1 上的输出(cythonized):

     13 function calls in 3.920 seconds

Ordered by: cumulative time

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.000    0.000    3.920    3.920 built-in method builtins.exec
    1    0.000    0.000    3.920    3.920 <string>:1(<module>)
    1    0.000    0.000    3.920    3.920 run.py:138(fun)
    1    3.920    3.920    3.920    3.920 src.test_cython.rbf_network
    1    0.000    0.000    0.000    0.000 run.py:141(<listcomp>)
    6    0.000    0.000    0.000    0.000 method 'rand' of 'mtrand.RandomState' objects
    1    0.000    0.000    0.000    0.000 built-in method numpy.core.multiarray.array
    1    0.000    0.000    0.000    0.000 method 'disable' of '_lsprof.Profiler' objects


Time without CProfile:  3.899562120437622

File2 上的输出(非 cython):

         1000014 function calls in 13.193 seconds

   Ordered by: cumulative time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.000    0.000   13.193   13.193 built-in method builtins.exec
    1    0.000    0.000   13.193   13.193 <string>:1(<module>)
    1    0.000    0.000   13.193   13.193 run.py:138(fun)
    1    7.948    7.948   13.193   13.193 test.py:4(rbf_network)
  1000000    5.245    0.000    5.245    0.000 built-in method math.exp
    1    0.000    0.000    0.000    0.000 run.py:141(<listcomp>)
    6    0.000    0.000    0.000    0.000 method 'rand' of 'mtrand.RandomState' objects
    1    0.000    0.000    0.000    0.000 built-in method numpy.core.multiarray.array
    1    0.000    0.000    0.000    0.000 built-in method numpy.core.multiarray.zeros
    1    0.000    0.000    0.000    0.000 method 'disable' of '_lsprof.Profiler' objects


Time without CProfile:  4.139716863632202

简而言之,使用 cProfile 测量时,Cythonized 代码似乎从 13.19 秒提高到 3.920 秒,但使用内置时间测量时,实际上只有 4.13 秒到 3.89 秒的改进。

Cython 确实提供了一些加速(即使是在天真的使用时),但通过时间分析器测量加速似乎夸大了结果。也许这些时间分析器通过使用 cython 而不是核心代码而受益。这是真的还是我做错了什么?

编辑:另外,我不确定为什么 cProfile 在 cythonized 代码中没有跟踪 built-in method math.exp。

【问题讨论】:

【参考方案1】:

python配置文件模块docs直接解决这个

注意分析器模块旨在为给定程序提供执行配置文件,而不是用于基准测试目的(为此,有 timeit 以获得合理准确的结果)。这尤其适用于针对 C 代码对 Python 代码进行基准测试:分析器会为 Python 代码引入开销,但不会为 C 级函数引入开销,因此 C 代码似乎比任何 Python 代码都快。

【讨论】:

分析 Cython 代码时,啥是`stringsource`?

】分析Cython代码时,啥是`stringsource`?【英文标题】:WhenprofilingCythonCode,whatis`stringsource`?分析Cython代码时,什么是`stringsource`?【发布时间】:2014-01-1100:00:20【问题描述】:我正在尝试优化一个繁重的Cython函数。我正在按照以下... 查看详情

通过使用具体类而不是接口,编译后的 js 的大小减少了多少

】通过使用具体类而不是接口,编译后的js的大小减少了多少【英文标题】:Byhowmuchisthecompiledjsreducedinsizebyusingconcreteclassesinsteadofinterfaces【发布时间】:2012-08-2002:49:48【问题描述】:我已经为GWT阅读过,指定返回具体实现的方法... 查看详情

减少cython并行中的数组

】减少cython并行中的数组【英文标题】:Reductionofarrayincythonparallel【发布时间】:2016-04-1018:02:05【问题描述】:我有一个需要包含不同事物总和的数组,因此我想对其每个元素执行归约。代码如下:cdefint*a=<int*>malloc(sizeof(int)... 查看详情

使用 Cython 启用并行性

】使用Cython启用并行性【英文标题】:EnablingParallelismwithCython【发布时间】:2018-04-0904:36:42【问题描述】:我正在尝试让Cython的parallel包的prange函数工作,似乎没有并行性生效。为了拥有一个MWE,我从Cython:AGuideforPythonProgrammers书... 查看详情

为整个程序启用 Cython 分析?

】为整个程序启用Cython分析?【英文标题】:EnableCythonprofilingforwholeprogram?【发布时间】:2014-12-0917:01:55【问题描述】:Cython文档说“Cython中的分析由编译器指令控制。可以通过Cython装饰器为整个文件或每个函数设置它。”是否... 查看详情

Cython 的功率谱

】Cython的功率谱【英文标题】:PowerspectrumwithCython【发布时间】:2012-05-2707:59:13【问题描述】:我正在尝试使用Cython优化我的代码。它正在做一个功率谱,而不是使用FFT,因为这是我们在课堂上被告知要做的。我尝试在Cython中编... 查看详情

模块pytz:UTC减少而不是增加

】模块pytz:UTC减少而不是增加【英文标题】:Modulepytz:UTCdecreaseinsteadofincrease【发布时间】:2019-07-2315:40:49【问题描述】:编辑:我想在我的国家UTC(西班牙)转换UTC时间。我正在使用模块pytz进行转换,但我得到的结果是UTC-1而... 查看详情

如何在我的代码中使用张量核心而不是 cuda 核心?

...英文标题】:Howtousetensorcoresinsteadofcudacoresinmycode?【发布时间】:2020-01-0900:44:34【问题描述】:我有RTX2070Nvidia显卡,上面有张量核心。我想使用张量核心而不是Cuda核心来运行我的深度学习代码。这个显卡可以吗?为了做到这一点... 查看详情

耳语合并似乎替换而不是聚合重复值

】耳语合并似乎替换而不是聚合重复值【英文标题】:whisper-mergeappearstoreplaceratherthanaggregateduplicatevalues【发布时间】:2021-08-1316:39:14【问题描述】:我想使用Whisper-merge通过聚合方法合并两个耳语数据库,但如果时间戳有任何重... 查看详情

有效的 Cython cProfiling 是不是意味着编写许多子函数?

】有效的CythoncProfiling是不是意味着编写许多子函数?【英文标题】:DoeseffectiveCythoncProfilingimplywritingmanysubfunctions?有效的CythoncProfiling是否意味着编写许多子函数?【发布时间】:2012-06-1221:35:50【问题描述】:我正在尝试使用Cython... 查看详情

cython和python的区别

cython是用c写的python实现Cython是不同的语言,相当于Python再加上些C特性,比如说类型声明。参考技术ACython是Python的一个超集,结合了Python的易用性和原生代码的速度,可以编译成C语言,产生的性能提升可以从几个百分点到几个... 查看详情

将 OpenGL 片段着色器设置为仅通过漫反射减少 vec4 色点的 RGB 值,而不是 alpha

】将OpenGL片段着色器设置为仅通过漫反射减少vec4色点的RGB值,而不是alpha【英文标题】:SettingOpenGLfragmentshadertoreduceonlytheRGBvaluesofthevec4colorpointsbythediffuse,notthealpha【发布时间】:2020-09-0916:28:17【问题描述】:在为我的OpenGL游戏设... 查看详情

使用 Cython 的 Line Profiling 内部函数

】使用Cython的LineProfiling内部函数【英文标题】:LineProfilinginnerfunctionwithCython【发布时间】:2016-06-2821:14:01【问题描述】:我在使用thisanswer分析我的Cython代码方面取得了相当大的成功,但它似乎不适用于嵌套函数。在thisnotebook中... 查看详情

我是不是正确使用核心位置?它似乎不起作用

】我是不是正确使用核心位置?它似乎不起作用【英文标题】:AmIusingCoreLocationcorrectly?Itdoesn\'tseemtobeworking我是否正确使用核心位置?它似乎不起作用【发布时间】:2011-08-1413:33:03【问题描述】:我刚开始对核心位置进行一些研... 查看详情

java,时间单独的if语句和循环而不是带有探查器的方法

...找到慢速方法来返工以使它们更快,但我似乎找不到任何分析器可以对方法内的单个循环或代码块进行计时。现在我不得不求助于手动 查看详情

减少火花返回字典而不是数据帧中的操作

】减少火花返回字典而不是数据帧中的操作【英文标题】:reduceoperationinsparkreturningdictionaryinsteaddataframe【发布时间】:2018-04-2917:25:18【问题描述】:我正在编写一个reduce操作,我期待一个数据框而不是字典。根据下面的代码,它... 查看详情

X 天后删除核心数据

...在X天后自动删除(这将基于NSDate)。我做了一些搜索,似乎您一次只能删除一个核心数据对象,而不是一组,更不用说基于某个日期的那些。我在想也许有一个循环通过每个对象运行——但这似乎是处理器非常重的。关于我应... 查看详情

cython与python的不同都有哪些

Cython是Python的一个超集,结合了Python的易用性和原生代码的速度,可以编译成C语言,产生的性能提升可以从几个百分点到几个数量级,具体Cython是Python的一个超集,结合了Python的易用性和原生代码的速度,可以编译成C语言,产... 查看详情