【发布时间】:2011-02-02 09:33:08
【问题描述】:
几周前,我问了一个关于提高用 Python 编写的函数的速度的问题。当时,TryPyPy 让我注意到了使用 Cython 这样做的可能性。他还好心地举了一个例子,说明我如何对代码 sn-p 进行 Cythonize。我想对下面的代码做同样的事情,看看我可以通过声明变量类型来多快。我有几个与此相关的问题。我在 cython.org 上看过教程,但我仍有一些问题。它们密切相关:
- 我不懂任何 C。我需要学习哪些部分才能使用 Cython 声明变量类型?
- python列表和元组对应的C类型是什么?例如,我可以在 Cython 中将
double用于 Python 中的float。我要为列表做什么?一般来说,我在哪里可以找到给定 Python 类型对应的 C 类型。
我如何对下面的代码进行 Cythonize 的任何示例都会非常有帮助。我在代码中插入了 cmets,提供有关变量类型的信息。
class Some_class(object):
** Other attributes and functions **
def update_awareness_status(self, this_var, timePd):
'''Inputs: this_var (type: float)
timePd (type: int)
Output: None'''
max_number = len(self.possibilities)
# self.possibilities is a list of tuples.
# Each tuple is a pair of person objects.
k = int(math.ceil(0.3 * max_number))
actual_number = random.choice(range(k))
chosen_possibilities = random.sample(self.possibilities,
actual_number)
if len(chosen_possibilities) > 0:
# chosen_possibilities is a list of tuples, each tuple is a pair
# of person objects. I have included the code for the Person class
# below.
for p1,p2 in chosen_possibilities:
# awareness_status is a tuple (float, int)
if p1.awareness_status[1] < p2.awareness_status[1]:
if p1.value > p2.awareness_status[0]:
p1.awareness_status = (this_var, timePd)
else:
p1.awareness_status = p2.awareness_status
elif p1.awareness_status[1] > p2.awareness_status[1]:
if p2.value > p1.awareness_status[0]:
p2.awareness_status = (price, timePd)
else:
p2.awareness_status = p1.awareness_status
else:
pass
class Person(object):
def __init__(self,id, value):
self.value = value
self.id = id
self.max_val = 50000
## Initial awareness status.
self.awarenessStatus = (self.max_val, -1)
【问题讨论】:
-
你有一个可以工作的纯 Python 代码吗?你有没有分析过它的执行?大部分时间都花在了哪里?
-
列表和元组的类型只有
list和tuple。 C 只定义了几种类型,主要是数字,所以几乎所有其他类型都使用与 Python 中相同的名称。 -
@eat:是的,我分析了代码,发现大部分时间都花在了上面的函数上。你是在问这个函数中大部分时间花在哪里?整个代码运行需要 47 秒,上述代码功能需要 22 秒。它被访问 79900 次。谢谢!
-
@kwatford:谢谢。这很有帮助。是否有一个很好的参考来谈论这些事情。我在 Cython 网站上没有找到这个。
-
@Curious2learn:我没见过。为了优化使用 Cython,您可能需要了解 C 以及 Python 的 C-API 的一些工作原理。其余的大部分都没有掌握这些知识。我认为其中一些内容没有很好记录的原因是设计师和大多数目标受众都非常熟悉它。很少有设计师会认为它需要说出来,也很少有用户需要说出来。如果您认为需要更多文档,我会在 Cython 的邮件列表中提出。
标签: python performance cython