Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.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中使用struct.unpack与sum将字节转换为整数_Python_File Io_Python 2.7_Integer - Fatal编程技术网

在Python中使用struct.unpack与sum将字节转换为整数

在Python中使用struct.unpack与sum将字节转换为整数,python,file-io,python-2.7,integer,Python,File Io,Python 2.7,Integer,通过浏览本网站上的各种问题,我找到了3种从文件中读取4字节(32位无符号小端)整数的可行方法。即: 1) myInt, = struct.unpack('<I', bytes) 2) myInt = struct.unpack('<I', bytes)[0] 3) myInt = sum(bytes[i] << (i*8) for i in range(4)) 1)myInt,=struct.unpack(“假设最好你是说效率更高,我会说前两个中的任何一个 从这个微观基

通过浏览本网站上的各种问题,我找到了3种从文件中读取4字节(32位无符号小端)整数的可行方法。即:

1) myInt, = struct.unpack('<I', bytes)
2) myInt = struct.unpack('<I', bytes)[0]
3) myInt = sum(bytes[i] << (i*8) for i in range(4))
1)myInt,=struct.unpack(“假设最好你是说效率更高,我会说前两个中的任何一个

从这个微观基准可以看出,第三个要糟糕得多:

>>> bytes=b'\x10\x11\x12\x13'
>>> import struct
>>> import timeit
>>> timeit.timeit('a,=struct.unpack("<I", bytes)', 'from __main__ import struct, bytes')
0.16049504280090332
>>> timeit.timeit('a=struct.unpack("<I", bytes)[0]', 'from __main__ import struct, bytes')
0.1881420612335205
>>> timeit.timeit('sum(bytes[i] << (i*8) for i in range(4))', 'from __main__ import bytes')
1.2574431896209717
(列表越长,
map
解决方案对列表的理解越快)

我想你们可以看看我的答案,其中我展示了一个纯python O(n)算法是如何通过使用“C级”循环的O(n logn)算法在任何合理的输入大小下获得beaton的

关于为什么这在python2中不起作用:

giacomo@jack-laptop:~$ python2
Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> bytes='\x10\x11\x12\x13'
>>> import timeit
>>> timeit.timeit('sum(bytes[i] << (i*8) for i in range(4))', 'from __main__ import bytes')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/timeit.py", line 230, in timeit
    return Timer(stmt, setup, timer).timeit(number)
  File "/usr/lib/python2.7/timeit.py", line 195, in timeit
    timing = self.inner(it, self.timer)
  File "<timeit-src>", line 6, in inner
  File "<timeit-src>", line 6, in <genexpr>
TypeError: unsupported operand type(s) for <<: 'str' and 'int'
giacomo@jack-笔记本电脑:~$python2
Python 2.7.3(默认值,2012年8月1日,05:14:39)
[GCC 4.6.3]关于linux2
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>字节='\x10\x11\x12\x13'
>>>导入时间信息
>>>timeit.timeit('sum(bytes[i]假设你的意思是更高效,我会说前两个中的任何一个

从这个微观基准可以看出,第三个要糟糕得多:

>>> bytes=b'\x10\x11\x12\x13'
>>> import struct
>>> import timeit
>>> timeit.timeit('a,=struct.unpack("<I", bytes)', 'from __main__ import struct, bytes')
0.16049504280090332
>>> timeit.timeit('a=struct.unpack("<I", bytes)[0]', 'from __main__ import struct, bytes')
0.1881420612335205
>>> timeit.timeit('sum(bytes[i] << (i*8) for i in range(4))', 'from __main__ import bytes')
1.2574431896209717
(列表越长,
map
解决方案对列表的理解越快)

我想你们可以看看我的答案,其中我展示了一个纯python O(n)算法是如何通过使用“C级”循环的O(n logn)算法在任何合理的输入大小下获得beaton的

关于为什么这在python2中不起作用:

giacomo@jack-laptop:~$ python2
Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> bytes='\x10\x11\x12\x13'
>>> import timeit
>>> timeit.timeit('sum(bytes[i] << (i*8) for i in range(4))', 'from __main__ import bytes')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/timeit.py", line 230, in timeit
    return Timer(stmt, setup, timer).timeit(number)
  File "/usr/lib/python2.7/timeit.py", line 195, in timeit
    timing = self.inner(it, self.timer)
  File "<timeit-src>", line 6, in inner
  File "<timeit-src>", line 6, in <genexpr>
TypeError: unsupported operand type(s) for <<: 'str' and 'int'
giacomo@jack-笔记本电脑:~$python2
Python 2.7.3(默认值,2012年8月1日,05:14:39)
[GCC 4.6.3]关于linux2
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>字节='\x10\x11\x12\x13'
>>>导入时间信息

>>>timeit.timeit('和(字节[i]你说最好是什么意思?更高效?更可移植?更可读?更优雅?@Bakuriu哈哈,你让我明白了!我想我是说最快,但由于我对Python非常陌生,我也想知道这些方法是否有任何危险或缺陷。你说最好是什么意思?更高效?更可移植?更可读?更优雅?@Bakuriu哈哈,你让我明白了!我想我指的是最快的速度,但由于我对Python非常陌生,我也想知道这些方法是否存在任何危险或缺陷。感谢微基准测试,我不知道如何做到这一点。我发现这很令人惊讶,因为我预期bitshift会更快。当我在过去研究C编程时,我发现Bitshipft有时用于执行快速算法。我在Python 2.7.3上尝试了第三种方法,效果很好。为什么你说它在python2中不起作用?回答得很好。感谢有关优化和python2的更新信息。我必须再次检查我的测试,看看有什么区别。感谢micro基准测试,我不知道如何做到这一点。我发现这很令人惊讶,因为我预期比特移位会更快。当我在过去研究C编程时,比特移位有时被用于执行快速算术。我在Python 2.7.3上尝试了第三种方法,它对我很好。你为什么说它在python2中不起作用?优秀的answer、 感谢您提供有关优化和python2的最新信息。我必须再次检查我的测试,看看有什么不同。