Python Cython函数中高度可变的执行时间

Python Cython函数中高度可变的执行时间,python,performance,cython,Python,Performance,Cython,从Python引擎调用的C编译函数(通过scipy.weave)迁移到Cython时,我遇到了性能度量问题 使用cProfile端到端评测的新cython函数(如果没有必要,我将不深入cython评测)记录高度可变的累积测量时间 例如,cython函数每5次重复执行9次的累积时间(在5次执行的预热后-评测函数未考虑到)为: 第一轮215627339秒 在第二轮比赛中235336131秒 每次执行都会使用不同但固定的参数多次调用函数。 也许这种可变性可能取决于测试机器的CPU负载(云托管的专用

从Python引擎调用的C编译函数(通过scipy.weave)迁移到Cython时,我遇到了性能度量问题

使用
cProfile
端到端评测的新cython函数(如果没有必要,我将不深入cython评测)记录高度可变的累积测量时间

例如,cython函数每5次重复执行9次的累积时间(在5次执行的预热后-评测函数未考虑到)为:

  • 第一轮215627339秒
  • 在第二轮比赛中235336131秒
每次执行都会使用不同但固定的参数多次调用函数。 也许这种可变性可能取决于测试机器的CPU负载(云托管的专用机器),但我想知道这种可变性(几乎10%)是否取决于cython或缺乏优化(我已经使用了关于划分、边界检查、环绕等的提示)


你知道如何采用可靠的指标吗?

我不是性能专家,但据我所知,你应该衡量的是每次执行的平均时间,而不是累计时间?除此之外,您的功能还包括从磁盘读取数据和/或发出网络请求吗?

首先,您需要确保您的测量设备能够测量您需要的内容:特别是,仅测量您消耗的系统资源。UNIX的
utime
就是这样一个命令,尽管它仍然包含交换时间。查看档案器的文档:它应该具有只测量函数所消耗的CPU时间的功能。如果是这样的话,那么你的数字是由其他原因造成的

一旦控制了外部变量,就需要检查内部变量。你什么也没说你的功能有多复杂。一些(许多?)函数可以为数据驱动的琐事提供捷径,例如乘以0或1。有些依赖于随数据变化的公开或隐蔽迭代。您需要分析与算法相关的输入数据


您可以使用的一个工具是一个面向线的探查器,用于详细说明变量的来源;查看哪些行需要额外的时间有助于确定“噪音”来自何处。

函数不做任何I/O(db、网络等),这是大型时间序列上的数学演算。我避免了平均测量值,因为它们似乎并不重要。无论如何,每一轮调用的数量都是一个常数,因此我不期望有不同的结果,但值得一试的是,您是在测量实际执行时间消耗,还是仅仅测量已用(挂钟)时间?如果是经过的时间,你有一些超出你控制范围的情况——比如服务器负载——这使得你的数据的准确性令人怀疑。这只是一个函数的cProfile测量时间,但我不知道是否有可能避免对任何方法的服务器负载敏感。我所寻求的是一种方法,我将检查是否存在一些不确定性行为,但由于函数代码只依赖于函数输入(固定的),不依赖于任何状态,因此我希望在每一轮中执行的路径完全相同。这是真的,除非有虫子,所以我要再次检查。。。现在我明白你在问题中所说的话的意思了:每次运行都在相同的调用参数序列上运行。这消除了我的一大部分担忧。还感谢您澄清状态:初始状态仍可能影响操作,但您正在检查。我仍然会做一个面向行的配置文件;这将有助于您识别随机系统中断。此外,当您多次这样做时,是否存在任何首要效应?第一次跑总是跑得更快吗?性能下降可能意味着延长列表或内存分配?我认为最后一点很有趣。我必须测量单次执行,因为Cython部分可能有一些内存问题