重温整数分区的优雅 Python 代码
在追求代码优雅的过程中,程序员常常寻求简洁高效的复杂问题解决方案。其中一个挑战是整数分区,即查找给定整数的所有分区为更小的正整数的任务。
完善解决方案
虽然之前的尝试提供了有效的解决方案,他们缺乏所需的优雅程度。匿名贡献者提出的更完善的解决方案既紧凑又速度快:
<code class="python">def partitions(n, I=1): yield (n,) for i in range(I, n//2 + 1): for p in partitions(n-i, i): yield (i,) + p</code>
性能比较
将此解决方案与 Nolen 的原始代码进行基准测试显示出显着的速度优势:
In [10]: %timeit -n 10 r0 = nolen(20) 1.37 s ± 28.7 ms per loop In [11]: %timeit -n 10 r1 = list(partitions(20)) 979 µs ± 82.9 µs per loop
其他解决方案
对于计算要求较高的情况,accel_asc 函数提供更快的性能:
<code class="python">def accel_asc(n): a = [0 for i in range(n + 1)] k = 1 y = n - 1 while k != 0: x = a[k - 1] + 1 k -= 1 while 2 * x < y: a[k] = x y -= x k += 1 l = k + 1 while x <= y: a[k] = x a[l] = y yield a[:k + 2] x += 1 y -= 1 a[k] = x + y y = x + y - 1 yield a[:k + 1]</code>
但是,这是值得的请注意,此解决方案比更简单的分区实现需要更多的内存。
以上是如何让整数分区的 Python 代码更加优雅和高效?的详细内容。更多信息请关注PHP中文网其他相关文章!