Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用cython序列化一组整数_Python_Serialization_Struct_Cython - Fatal编程技术网

Python 使用cython序列化一组整数

Python 使用cython序列化一组整数,python,serialization,struct,cython,Python,Serialization,Struct,Cython,我从页面上看到了这个用于序列化整数的示例代码,其速度比viastruct.pack快3倍: def ser2(): cdef int x = 42 return (<char *>&x)[:sizeof(int)] def ser2(): cdef int x=42 返回(&x)[:sizeof(int)] 我想知道如何对一组整数执行此操作。 我看到cython有int[:]和array.array类型,但我仍然不明白如何以整数列表为例,获得与通过st

我从页面上看到了这个用于序列化整数的示例代码,其速度比via
struct.pack
快3倍:

def ser2(): 
    cdef int x = 42 
    return (<char *>&x)[:sizeof(int)]
def ser2():
cdef int x=42
返回(&x)[:sizeof(int)]
我想知道如何对一组整数执行此操作。
我看到cython有
int[:]
array.array
类型,但我仍然不明白如何以整数列表为例,获得与通过
struct.pack('I',*num\u list)
相同(但更快)的结果
map()
对我来说似乎没有更快的速度,我想知道应该如何做到这一点。

我想您希望加快以下速度(Python3):

如果没有
struct
和cython,您可以在python中实现以下功能:

import array
bytes(array.array('i', lst))
但是,这比
struct
-模块稍微慢一些:

>>> %timeit struct.pack('i'*len(lst), *lst)
2.38 µs ± 9.48 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
>>> %timeit bytes(array.array('i',lst))
3.94 µs ± 92 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
但是,cython可用于加速
数组的创建,有关文档,请参阅和:

计时显示以下性能:

#list_size    struct-code    cython-code    speed-up
     1           343 ns         238 ns        1.5
    10           619 ns         283 ns         2
   100          2.38 µs        2.38 µs        3.5
  1000          21.6 µs        5.11 µs         4
 10000           266 µs        47.5 µs        5.5 
i、 e.cython提供了一些加速功能,从小型列表的
1.5
到大型列表的
5.5

也许这可以进一步调整,但我希望你能理解


测试代码:

import struct
for n in [1, 10,10**2, 10**3, 10**4]:
    print ("N=",n)
    lst=list(range(n))
    print("struct:")
    %timeit struct.pack('i'*len(lst), *lst)
    print("cython:")
    %timeit ser_int_list(lst)

谢谢但是,字节(res)不是我需要的,而是res.tostring()。你能建议我如何用与单int类似的强制转换技巧来“抓取”底层字节吗?我想可能是吧faster@Jay对不起,我想是蟒蛇3。我编辑了我的答案,所以它可以同时使用Python2(返回str)和Python3(返回字节)。但是,与int示例相同,内存是在后台复制的。使用
str
@Jay如果您想避免复制,我认为您需要一个稍微不同的界面-我认为您不能使用
str
来完成。不过,您应该首先计时,以检查它是否值得:我猜对于非常小的列表,开销可能在10%左右,而对于较大的列表,开销可能会更少。谢谢,它现在起作用了。不幸的是,我没有看到cython函数和python自己的array.array('I',lst).tostring()之间的时间差,因为在尝试这个函数时,它是一个大的数字列表。我猜cython在这种特殊情况下并没有增加任何好处,尽管cython的技术非常有用
#list_size    struct-code    cython-code    speed-up
     1           343 ns         238 ns        1.5
    10           619 ns         283 ns         2
   100          2.38 µs        2.38 µs        3.5
  1000          21.6 µs        5.11 µs         4
 10000           266 µs        47.5 µs        5.5 
import struct
for n in [1, 10,10**2, 10**3, 10**4]:
    print ("N=",n)
    lst=list(range(n))
    print("struct:")
    %timeit struct.pack('i'*len(lst), *lst)
    print("cython:")
    %timeit ser_int_list(lst)