一个相对简单的问题:
如果我将CPU绑定的瓶颈方法从Python转换为C扩展(大致实现相同的算法),
更新: 人们似乎抱怨缺乏具体细节。我主要试图了解哪些因素会使一段Python代码成为在C中重写的良好候选者(即,如果原始Python受CPU限制,移植到C实际上会给你提速)。
具体来说,这是我正在看的代码片段。基本上它是一个递归方法,它采用两个列表列表(一列“列”,其中每列包含可能进入该列的可能值...基本上,一个模式),并查看是否可以使n小于n (通常为1)更改(其中更改可能是为列添加新值,添加新列,删除列等),以便有一些值序列(每列中的一个值)可以构建出任何一种模式。它在精神上与计算字符串之间的编辑距离非常相似。这是代码:
def CheckMerge(self, schemai, schemaj, starti, startj, \
changesLeft, path):
# if starti == 0 and startj == 0:
# print '\n'
# print schemai.schema
# print ''
# print schemaj.schema
if starti == len(schemai.schema) and startj == len(schemaj.schema):
return (True, path)
if starti < len(schemai.schema):
icopy = schemai.schema[starti]
else:
icopy = []
if startj < len(schemaj.schema):
jcopy = schemaj.schema[startj]
else:
jcopy = []
intersect = set(icopy).intersection(set(jcopy))
intersect.discard('')
if len(intersect) == 0:
if starti < len(schemai.schema) and \
('' in schemai.schema[starti] or changesLeft > 0):
if not '' in schemai.schema[starti]:
changesLeft -= 1
changesCopy = list(path)
changesCopy.append('skipi')
result,steps = self.CheckMerge(schemai, schemaj, starti+1, startj, \
changesLeft, changesCopy)
if result:
return (result,steps)
elif not '' in schemai.schema[starti]:
changesLeft += 1
if startj < len(schemaj.schema) and \
('' in schemaj.schema[startj] or changesLeft > 0):
if not '' in schemaj.schema[startj]:
changesLeft -= 1
changesCopy = list(path)
changesCopy.append('skipj')
result,steps = self.CheckMerge(schemai, schemaj, starti, startj+1, \
changesLeft, changesCopy)
if result:
return (result, steps)
elif not '' in schemaj.schema[startj]:
changesLeft += 1
if changesLeft > 0:
changesCopy = list(path)
changesCopy.append('replace')
changesLeft -= 1
result,steps = self.CheckMerge(schemai, schemaj, starti+1, startj+1, \
changesLeft, changesCopy)
if result:
return (result, steps)
return (False, None)
else:
changesCopy = list(path)
changesCopy.append('merge')
result,steps = self.CheckMerge(schemai, schemaj, starti+1, startj+1, \
changesLeft, changesCopy)
if result:
return (result, steps)
else:
return (False, None)
答案 0 :(得分:1)
完全取决于您的代码。 如果硬件支持某些代码,例如,如果您正在计算汉明权重,执行AES加密,计算CRC或具有可向量化的代码,那么就会有硬件指令来提高速度,而您可以通过C代码访问它们,但不能访问python代码。
答案 1 :(得分:0)
Python运行速度非常快,因此您需要一个明确的理由将Python函数转换为C,就像访问已经提到过的硬件一样。但是,这是另一个原因。
Python(C Python)遭遇全局解释器锁(GIC)问题。 Python线程不能同时运行,一次只能运行一个。因此,您可以将特定于线程的代码放入C中,这不受GIC问题的限制。
一般来说,如果您认为您的Python代码很慢并且没有您在帖子中提到的特定原因,那么您可能需要适应更多Python-ic编码约定,例如列表推导和其他功能在Python中找到而不是太多其他语言。
我的最终评论不是对您的代码示例的反映。相反,我将它作为我学会聆听大量Python演示文稿的一般智慧提供。