Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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中读取字节-io.BytesIO v/s binascii.unhexlify_Python_Python 3.x - Fatal编程技术网

在Python中读取字节-io.BytesIO v/s binascii.unhexlify

在Python中读取字节-io.BytesIO v/s binascii.unhexlify,python,python-3.x,Python,Python 3.x,以下两种读取字节的方法有什么区别? stream = BytesIO(unhexlify('000000010000')) print(int.from_bytes(stream.read(4), byteorder="big")) //prints 1 bytes = unhexlify('000000010000') print(int.from_bytes(bytes[:4], byteorder="big")) //prints 1 哪个更好?为什么?如果您知道您的字符串就是字

以下两种读取字节的方法有什么区别?

stream = BytesIO(unhexlify('000000010000'))
print(int.from_bytes(stream.read(4), byteorder="big"))  //prints 1


bytes = unhexlify('000000010000')
print(int.from_bytes(bytes[:4], byteorder="big"))  //prints 1

哪个更好?为什么?

如果您知道您的字符串就是字符串,为什么不在切片后直接使用
base
将其转换为“16”?例如:

>>> my_hex = '000000010000'
>>> int(my_hex[:8], base=16)
1
这里您必须注意,我将索引为“8”而不是“4”的字符串分片,但是由于我们知道它是一个十六进制字符串,我们可以根据
2
字符表示一个
hex
数字对其进行相应的分片

以下是您和我的解决方案的性能比较:

mquadri$ python3 -m timeit "my_hex = '000000010000'; int(my_hex[:8], base=16)"
1000000 loops, best of 3: 0.581 usec per loop

mquadri$ python3 -m timeit -s "from io import BytesIO; from binascii import unhexlify" "stream = BytesIO(unhexlify('000000010000')); int.from_bytes(stream.read(4), byteorder='big')"
1000000 loops, best of 3: 1.15 usec per loop

mquadri$ python3 -m timeit -s "from binascii import unhexlify" "bytes = unhexlify('000000010000'); int.from_bytes(bytes[:4], byteorder='big')"
1000000 loops, best of 3: 0.764 usec per loop
如您所见,简单地使用
int
进行转换比两种解决方案都更有效


但是,如果您只对您提到的解决方案感兴趣,那么我将推荐不使用
io.BytesIO的解决方案,因为:

  • 如果不使用
    ByteIO
    ,您将需要一个较小的
    imports
  • 相对而言,您的第二个解决方案看起来也更简单

注意:对于绩效衡量,我不计算导入时间,以防有人计划说“此差异与额外导入有关”;)

如果您知道您的字符串就是字符串,为什么不在切片后直接将其转换为
base
为“16”?例如:

>>> my_hex = '000000010000'
>>> int(my_hex[:8], base=16)
1
这里您必须注意,我将索引为“8”而不是“4”的字符串分片,但是由于我们知道它是一个十六进制字符串,我们可以根据
2
字符表示一个
hex
数字对其进行相应的分片

以下是您和我的解决方案的性能比较:

mquadri$ python3 -m timeit "my_hex = '000000010000'; int(my_hex[:8], base=16)"
1000000 loops, best of 3: 0.581 usec per loop

mquadri$ python3 -m timeit -s "from io import BytesIO; from binascii import unhexlify" "stream = BytesIO(unhexlify('000000010000')); int.from_bytes(stream.read(4), byteorder='big')"
1000000 loops, best of 3: 1.15 usec per loop

mquadri$ python3 -m timeit -s "from binascii import unhexlify" "bytes = unhexlify('000000010000'); int.from_bytes(bytes[:4], byteorder='big')"
1000000 loops, best of 3: 0.764 usec per loop
如您所见,简单地使用
int
进行转换比两种解决方案都更有效


但是,如果您只对您提到的解决方案感兴趣,那么我将推荐不使用
io.BytesIO的解决方案,因为:

  • 如果不使用
    ByteIO
    ,您将需要一个较小的
    imports
  • 相对而言,您的第二个解决方案看起来也更简单

注意:对于绩效衡量,我不计算导入时间,以防有人计划说“此差异与额外导入有关”;)

使用IO构造(
StringIO
BytesIO
)的目的是处理模拟流的对象(如文件)。因此,第一个解决方案是将字节包装在类似文件的对象中,并像读取文件一样从包装器中读取。第二个解决方案只是读取字节


我说,如果代码的语义不要求字节是流,请跳过IO解决方案,直接转到源代码。

使用IO构造(
StringIO
BytesIO
)的目的是处理模拟流的对象(如文件)。因此,第一个解决方案是将字节包装在类似文件的对象中,并像读取文件一样从包装器中读取。第二个解决方案只是读取字节


我说,如果代码的语义不要求字节是流,请跳过IO解决方案,直接转到源代码。

第一个看起来过于复杂。为什么要将
unexlify
的结果转换为BytesIO并返回?第一个看起来过于复杂。为什么要将
unexlify
的结果转换为BytesIO并返回?嘿!你能告诉我这是什么意思吗“我说如果你的代码的语义不要求字节是流”。何时使用字节作为流?@LokeshCherukuri我的意思是,如果您的代码不希望使用特定的IO流,那么您不必担心创建一个IO流。在其他一些情况下,如果很清楚字节流来自IO源,代码可能会更好地理解。在这种情况下,为了更加清晰,也许为了兼容性,最好使用IO。语义不一定与性能有关,而是与清晰性有关,因此最终您将判断什么更重要。至于何时在技术上使用字节流,可能存在一些情况,例如,您需要使用通常与文件一起使用的API。但是,您可以在API中标识一个函数,该函数可以执行需要应用于当前内存中的某些字节的作业。因此,您将这些字节包装在IO中,并将流发送到您的函数。嘿!你能告诉我这是什么意思吗“我说如果你的代码的语义不要求字节是流”。何时使用字节作为流?@LokeshCherukuri我的意思是,如果您的代码不希望使用特定的IO流,那么您不必担心创建一个IO流。在其他一些情况下,如果很清楚字节流来自IO源,代码可能会更好地理解。在这种情况下,为了更加清晰,也许为了兼容性,最好使用IO。语义不一定与性能有关,而是与清晰性有关,因此最终您将判断什么更重要。至于何时在技术上使用字节流,可能存在一些情况,例如,您需要使用通常与文件一起使用的API。但是,您可以在API中标识一个函数,该函数可以执行需要应用于当前内存中的某些字节的作业。因此,您将这些字节包装在IO中,并将流发送到您的函数。