【问题标题】:How to figure out why cython-izing code slows it down?如何弄清楚为什么 cython-izing 代码会减慢它的速度?
【发布时间】:2012-05-23 23:24:51
【问题描述】:

我们有一些用 python 编写的代码,其中使用了一些实际上只是“结构”的类——这些类的实例中只有一堆字段,没有方法。示例:

class ResProperties:
    def __init__(self):
        self.endDayUtilities = 0
        self.marginalUtilities = []
        self.held = 0
        self.idleResource = True
        self.experience = 0.0
        self.resSetAside = 0
        self.unitsGatheredToday = 0

我们的主要代码使用了这个类的一堆实例。

为了加快代码速度,我想我会对这个类进行 cython 化:

cdef class ResProperties:

    cdef public float endDayUtilities
    cdef public list marginalUtilities
    cdef public int held
    cdef public int idleResource
    cdef public float experience
    cdef public int resSetAside
    cdef public int unitsGatheredToday

    def __init__(self):
        self.endDayUtilities = 0
        # etc: code just like above.

但是,结果是代码现在运行速度慢了 25%!

我如何找出导致代码现在运行速度变慢的原因?

谢谢。

【问题讨论】:

  • “代码”运行速度慢了 25%?什么代码?
  • 你如何衡量这种放缓?
  • 如果类只是属性的容器,为什么不使用命名元组呢?
  • 代码是一个更大的模拟的一部分——社团项目——code.google.com/p/societies。我有一个标准配置,在我的机器上运行大约需要 58 秒。随着变化,它上升到大约 80 秒。

标签: python optimization cython


【解决方案1】:

您将这些类转换为 Cython,但仍在 Python 代码中使用它们?

将数据从 C 转换为 Python 并返回会产生开销。例如,您的 endDayUtilities 成员是 C 样式的浮点数。当您从 Python 访问它时,必须先构造一个 float() 对象,然后您的 Python 代码才能对其进行任何操作。当您从 Python 分配给该属性时,同样的事情必须反过来发生。

在我的脑海中,我估计这些数据转换的性能开销在......哦,大约 25%。 :-)

在您将一些使用该数据的代码移至 Cython 之前,您不会看到性能提升。基本上,你在C-land停留的时间越长,你就会做得越好。来回走会害死你。

作为另一种更简单的方法,您可能想尝试 Psyco 或 PyPy 而不是 Cython。

【讨论】:

    猜你喜欢
    • 2017-04-11
    • 2018-11-30
    • 1970-01-01
    • 2012-01-02
    • 2019-01-03
    • 2018-01-02
    • 2014-01-10
    • 2021-06-15
    • 1970-01-01
    相关资源
    最近更新 更多