使用以下命令写入空字节有何区别?
print("\x00")
并写一个:
print(struct.pack("B", 0))
我自由地将两个执行时间都设置为以下时间:
def struct_exec_time():
start_time = time.time()
import struct
print(struct.pack("B",0))
return time.time() - start_time
def simple_print_exec():
start_time = time.time()
print("\x00")
return time.time() - start_time
同时运行它们时:
>>> for _ in range(1):
... print("Struct execution time: {}".format(struct_exec_time()))
... print("Simple print execution time: {}".format(simple_print_exec()))
...
Struct execution time: 2.38418579102e-05
Simple print execution time: 3.09944152832e-06
>>>
似乎struct比第一次执行时的打印功能要快,因为如果多次运行它们,则执行一次:
>>> for _ in range(5):
... print("Struct execution time: {}".format(struct_exec_time()))
... print("Simple print execution time: {}".format(simple_print_exec()))
...
Struct execution time: 2.71797180176e-05
Simple print execution time: 5.00679016113e-06
Struct execution time: 9.05990600586e-06
Simple print execution time: 4.05311584473e-06
Struct execution time: 7.15255737305e-06
Simple print execution time: 5.00679016113e-06
Struct execution time: 7.15255737305e-06
Simple print execution time: 4.05311584473e-06
Struct execution time: 6.91413879395e-06
Simple print execution time: 4.76837158203e-06
那么,两者之间有什么区别?为什么struct只更快然后打印一次?
编辑:
在计时器之外进行import struct
呼叫:
def struct_exec_time():
import struct
start_time = time.time()
print(struct.pack("B",0))
return time.time() - start_time
for _ in range(5):
print("Struct exec: {}".format(struct_exec_time()))
print("Print exec: {}".format(simple_print_exec()))
Struct exec: 3.40938568115e-05
Print exec: 2.86102294922e-06
Struct exec: 2.86102294922e-06
Print exec: 3.09944152832e-06
Struct exec: 2.86102294922e-06
Print exec: 3.09944152832e-06
Struct exec: 3.81469726562e-06
Print exec: 3.09944152832e-06
Struct exec: 2.86102294922e-06
Print exec: 2.14576721191e-06
答案 0 :(得分:2)
如果您使用的是Python 2.7,则两个值相等且类型相同:str
(= Python 3 bytes
)。
这是python 2/3测试:
import struct
b1 = struct.pack('B', 0)
b2 = b'\x00'
assert b1 == b2
assert type(b1) == type(b2)
在日常编程中,我更喜欢使用字节字符串而不是使用struct
。
引用文档:
此模块在Python值和以Python字节对象表示的C结构之间执行转换。
修改
有关性能的注释:b'\ x00'是文字。与函数调用相比,对文字的求值总是更快。
答案 1 :(得分:0)
他们不一样。
print("\x00")
这将打印unicode代码点0; unicode将被解码为终端的编码(默认为utf-8),相应的字节将被发送至进程的stdout
print(struct.pack("B", 0))
这将打印空字节表示形式。由于struct.pack()的结果是一个字节字符串,因此python不会尝试对其进行编码,而print()
会将其转换为表示形式:
>>> print('\x00')
>>> import struct
>>> print(struct.pack("B", 0))
b'\x00'