6

データをコピーするだけで非常に長い数値を文字列に変換するlibはありますか?

これらのワンライナーは遅すぎます:

def xlong(s):
    return sum([ord(c) << e*8 for e,c in enumerate(s)])

def xstr(x):
    return chr(x&255) + xstr(x >> 8) if x else ''

print xlong('abcd'*1024) % 666
print xstr(13**666)
4

6 に答える 6

4

構造体モジュールが必要です。

packed = struct.pack('l', 123456)
assert struct.unpack('l', packed)[0] == 123456
于 2008-11-30T15:45:53.157 に答える
2

実際、 long(s,256) が不足しています。さらに潜んでみると、Python CAPI ファイル "longobject.h" に 2 つの関数があることがわかります。

PyObject * _PyLong_FromByteArray( const unsigned char* bytes, size_t n, int little_endian, int is_signed);
int _PyLong_AsByteArray(PyLongObject* v, unsigned char* bytes, size_t n, int little_endian, int is_signed);

彼らは仕事をします。一部の python モジュールに含まれていない理由がわかりません。間違っている場合は修正してください。

于 2008-12-14T14:13:38.500 に答える
2

どうですか

from binascii import hexlify, unhexlify

def xstr(x):
    hex = '%x' % x
    return unhexlify('0'*(len(hex)%2) + hex)[::-1]

def xlong(s):
    return int(hexlify(s[::-1]), 16)

私はそれを計りませんでしたが、再帰を使用しないため、より高速で、より大きな数でも動作するはずです。

于 2008-11-30T16:13:23.413 に答える
1

高速なシリアル化が必要な場合は、マーシャルモジュールを使用してください。あなたの方法よりも約400倍高速です。

于 2008-11-30T17:21:12.370 に答える
0

文字列形式は気にしないと思いますが、シリアル化が必要ですか? もしそうなら、Python の組み込みシリアライザーであるcPickleモジュールを使用してみませんか? このdumps関数は、長い整数を含む任意の Python オブジェクトを文字列に変換しloadsます。関数はその逆です。ファイルに保存するためにこれを行っている場合は、dumpおよびload関数も確認してください。

>>> import cPickle
>>> print cPickle.loads(cPickle.dumps(13**666)) % 666
73
>>> print (13**666) % 666
73
于 2008-11-30T17:11:41.547 に答える
-1

cPicklevsのパフォーマンスmarshal(Python 2.5.2、Windows):

python -mtimeit -s"from cPickle import loads,dumps;d=13**666" "loads(dumps(d))"
1000 loops, best of 3: 600 usec per loop

python -mtimeit -s"from marshal import loads,dumps;d=13**666" "loads(dumps(d))"
100000 loops, best of 3: 7.79 usec per loop

python -mtimeit -s"from pickle import loads,dumps;d= 13**666" "loads(dumps(d))"
1000 loops, best of 3: 644 usec per loop

marshalはるかに高速です。

于 2008-11-30T18:01:58.060 に答える