我在Python 3.2中有一个代码,我想在Python 2.7中运行它.我确实转换了它(已经把missing_elements两个版本的代码都放了)但我不确定这是否是最有效的方法.基本上如果yield from在missing_element功能的上半部分和下半部分有两个如下所示的调用会发生什么?两个部分(上部和下部)中的条目是否在一个列表中相互附加,以便父级递归函数与yield from调用一起使用并将两个部分一起使用?
def missing_elements(L, start, end): # Python 3.2
if end - start <= 1:
if L[end] - L[start] > 1:
yield from range(L[start] + 1, L[end])
return
index = start + (end - start) // 2
# is the lower half consecutive?
consecutive_low = L[index] == L[start] + (index - start)
if not consecutive_low:
yield from missing_elements(L, start, index)
# is the upper part consecutive?
consecutive_high = L[index] …Run Code Online (Sandbox Code Playgroud) 根据这个问题的答案,C#中的yield break相当于python中的return.在正常情况下,'return'确实会停止发电机.但是如果你的函数除了返回之外什么都不做,你将获得一个None而不是一个空的迭代器,它在C#中由yield break返回
def generate_nothing():
return
for i in generate_nothing():
print i
Run Code Online (Sandbox Code Playgroud)
你会得到一个TypeError:'NoneType'对象是不可迭代的.但是如果我在返回之前添加一个从不运行的yield,这个函数会返回我期望的结果.
def generate_nothing():
if False: yield None
return
Run Code Online (Sandbox Code Playgroud)
如果有效,但似乎有线.谁有更好的主意?
谢谢,
我很好奇使用raise StopIteration和return生成器中的语句之间的区别.
例如,这两个函数之间有什么区别吗?
def my_generator0(n):
for i in range(n):
yield i
if i >= 5:
return
def my_generator1(n):
for i in range(n):
yield i
if i >= 5:
raise StopIteration
Run Code Online (Sandbox Code Playgroud)
我猜的更"Python化"的方式来做到这一点是第二种方式(请纠正我,如果我错了),但据我可以看到两种方式提出一个StopIteration例外.
我正在调整我的宠物项目以改善其性能.我已经淘汰了剖析器来识别热点,但是我认为理解Pythons的性能特性会更好一些,这对今后非常有用.
我想知道一些事情:
一些现代编译器拥有非常聪明的优化器,通常可以使用简单的代码并使其运行速度比任何人类调整代码的尝试都要快.根据优化器的智能程度,我的代码可能要好得多"哑".
虽然Python是一种"解释"语言,但它确实可以编译成某种形式的字节码(.pyc).这样做有多聪明?
如何在Python中存储数字.它们是在内部存储为整数/浮点数还是作为字符串移动?
NumPy可以带来多少性能差异?该应用程序大量使用向量和相关数学.使用它来加速这些操作可以产生多大的差异.
如果您能想到任何值得了解的事情,请随时提及.
因为有一些人引入了"先看看你的算法"的建议(这是非常明智的建议,但对于我提出这个问题的目的并没有真正的帮助)我会在这里添加一些关于最新情况,为什么我要问这个问题.
有问题的宠物项目是用Python编写的光线追踪器.它还不是很远,目前只是针对场景中的两个对象(三角形和球形)进行测试.没有执行阴影,阴影或光照计算.算法基本上是:
for each x, y position in the image:
create a ray
hit test vs. sphere
hit test vs. triangle
colour the pixel based on the closest object, or black if no hit.
Run Code Online (Sandbox Code Playgroud)
光线跟踪中的算法改进通常通过尽早消除场景中的对象来工作.它们可以为复杂的场景提供相当大的提升,但是如果这个光线跟踪器无法在没有挣扎的情况下对仅仅两个物体进行测试,那么它根本无法处理.
虽然我意识到基于Python的光线跟踪器不能完全达到基于C的光线跟踪器的性能,因为像Arauna这样的实时光线跟踪器可以在我的计算机上管理15-20 FPS,渲染640x480的相当复杂的场景,我希望在Python中渲染一个非常基本的500x500图像可以在一秒钟内完成.
目前,我的代码需要38秒.在我看来,它真的不应该花那么长时间.
分析显示了在这些形状的实际命中测试例程中花费的大部分时间.这在光线追踪器中并不是特别令人惊讶,也是我所期待的.这些命中测试的呼叫计数分别为250,000(精确到500x500),这表明它们的调用次数与它们应该的频率相同.这是3%的漂亮教科书案例,其中建议进行优化.
当我努力改进代码时,我正计划进行完整的计时/测量.然而,如果没有一些关于Python成本的基本知识,那么我调试代码的尝试只会在黑暗中磕磕绊绊.我认为获得一点点知识来照亮我的方式对我很有帮助.