Python-基准磁盘-在文件中精确写入x字节

Python-基准磁盘-在文件中精确写入x字节,python,file,byte,benchmarking,disk,Python,File,Byte,Benchmarking,Disk,我试图对我的硬盘进行基准测试,也就是说计算它的延迟(ms)和吞吐量(MB/s)。 为此,我想测量Python函数f.write的执行时间。 我需要的是准确地将x字节写入我的文件。 我知道我需要使用 f = open(file_name, 'wb') 那我要做的就是 for i in range(blocksize) f.write(b'\xff') 然而,我获得的吞吐量(MB/s)结果太低了。延迟看起来是正确的。所以我推断,当我做前面几行时,我实际上在向文件中写入多个字节,我正在写入

我试图对我的硬盘进行基准测试,也就是说计算它的延迟(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可能会更快



在进行了一些计时之后,这与速度匹配,因此不会更快。

简单地说,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可能会更快



在做了一些计时之后,这与速度匹配,所以你不会更快。

你需要的是使用低级别的I/O来最小化调用时间开销和刷新缓冲区,否则你的写操作可能会在某个地方被缓冲(例如通过你使用的操作系统)

这段代码是我的业余爱好项目的一部分,这是一个在Python中对HDD和SSD进行基准测试的简单工具。它是完全开源的,现在处于alpha阶段,尽管您已经可以使用它,并且如果感兴趣,可以参与开发。希望你能找到一些好主意,或者甚至提供你的。
这里有一个链接:

要使结果准确,您需要使用低级别I/O来最小化调用时间开销并刷新缓冲区,否则您的写入可能会在某个地方被缓冲(例如通过您使用的操作系统)

这段代码是我的业余爱好项目的一部分,这是一个在Python中对HDD和SSD进行基准测试的简单工具。它是完全开源的,现在处于alpha阶段,尽管您已经可以使用它,并且如果感兴趣,可以参与开发。希望你能找到一些好主意,或者甚至提供你的。
这里有一个链接:

你用什么来计时?time.time()?如果您知道的话,您可能希望使卡盘的大小与文件系统块的大小相等。如果你不确定有多大,4kb通常是一个很好的猜测。我在虚拟机中运行linux,那么文件系统块大小是windows还是linux?你认为在虚拟机中运行会对我计时的准确性产生副作用吗?@JahMyst
time python3/python2/pypypy/pypypy3 wite_blocks.py 100000000
。请查看编辑的代码,现在我的结果太高了,我不明白为什么。我用时间计时。时间()。timeit模块的结果相同…你用什么来计时?time.time()?如果您知道的话,您可能希望使卡盘的大小与文件系统块的大小相等。如果你不确定有多大,4kb通常是一个很好的猜测。我在虚拟机中运行linux,那么文件系统块大小是windows还是linux?你认为在虚拟机中运行会对我计时的准确性产生副作用吗?@JahMyst
time python3/python2/pypypy/pypypy3 wite_blocks.py 100000000
。请查看编辑的代码,现在我的结果太高了,我不明白为什么。我用时间计时。时间()。与timeit模块相同的结果。。。