我正在尝试对我的硬盘进行基准测试,也就是说计算它的延迟 (ms) 和吞吐量 (MB/s)。 为此,我想测量 Python 函数 f.write 的执行时间。 我需要的是将 x 个字节准确地写入我的文件。 我知道我需要使用
打开我的文件f = open(file_name, 'wb')
那我做的就是
for i in range(blocksize)
f.write(b'\xff')
但是,我获得的吞吐量 (MB/s) 结果太低了。延迟看起来是正确的。所以我推断,当我执行前几行时,我实际上是在向文件写入多个字节,我正在写入一个包含一个字节的字符串...... 我知道该对象在 Python 中实际上没有大小,但有没有办法解决这个问题?
编辑 好的,这是新代码,现在结果莫名其妙地太高了!我的磁盘写入限制应该是 100MB/s,但我的结果快了十倍。怎么了 ? 导入系统 导入时间
f = open("test.txt",'wb+')
def file_write_seq_access(blocksize):
chunk = b'\xff'*4000
for i in range(blocksize//4000):
f.write(chunk)
if __name__ == '__main__':
start_time = time.time()
file_write_seq_access(int(sys.argv[1]))
stop_time = time.time()
diff = stop_time - start_time
print diff, "s"
print (int(sys.argv[1])/diff),"B/s"
请您参考如下方法:
简单地说,Python 对于这种逐字节写入的速度不够快,而且文件缓冲和类似操作会增加太多开销。
你应该做的是分块操作:
import sys
blocksize = int(sys.argv[1])
chunk = b'\xff'*10000
with open("file.file", "wb") as f:
for _ in range(blocksize // 10000):
f.write(chunk)
可能使用 PyPy 应该进一步(非常小,可能是负面的)加速。
请注意,操作系统会干扰此处的计时,因此会有很多差异。使用 C 可能会更快。
在做了一些计时之后,这与 dd 的速度匹配,所以你不会变得更快。
