擅长:python、mysql、java
<p>我想你真的应该使用numpy,我肯定它有一些内置的东西。使用<code>array</code>模块也可能更快。但我还是要试试看。</p>
<p>IMX,创建一个生成器并使用一个列表理解和/或内置求和比附加到列表的循环快,因为附加可以在内部完成。哦,而且大绳上的“lstrip”一定很贵。</p>
<p>另外,一些样式点:特殊情况不够特殊;而且您似乎没有得到关于新<code>x if y else z</code>构造的备忘录。:)尽管我们不需要它。;)</p>
<pre><code>from struct import pack as _pack
Q_size = 64
Q_bitmask = (1L << Q_size) - 1L
def quads_gen(a_long):
while a_long:
yield a_long & Q_bitmask
a_long >>= Q_size
def pack_long_big_endian(a_long, pad = 1):
if lnum < 0:
raise RangeError("Cannot use packl to convert a negative integer "
"to a string.")
qs = list(reversed(quads_gen(a_long)))
# Pack the first one separately so we can lstrip nicely.
first = _pack('>Q', qs[0]).lstrip('\x00')
rest = _pack('>%sQ' % len(qs) - 1, *qs[1:])
count = len(first) + len(rest)
# A little math trick that depends on Python's behaviour of modulus
# for negative numbers - but it's well-defined and documented
return '\x00' * (-count % pad) + first + rest
</code></pre>