计算文件内容md5值哪种性能最好呢?可能不是想象中那么简单!
代码如下:
def gen_files(folder_path = 'E:\\test_folder'):
import os
import random
#pip install faker --proxy=http://127.0.0.1:25378
from faker import Faker
def generate_random_file(filepath, min_size, max_size):
fake = Faker()
file_size = random.randint(min_size, max_size)
with open(filepath, 'w') as f:
f.seek(file_size - 1)
f.write('\0')
with open(filepath, 'a') as f:
while os.path.getsize(filepath) < file_size:
f.write(fake.text())
# 设置生成文件的数量
N = 20
# 设置文件大小范围(单位为字节)
min_file_size = 1024 * 1024 * 1024 # 1GB
max_file_size = 4 * 1024 * 1024 * 1024 # 2GB
# 指定生成文件的路径
folder_path = folder_path # 将路径修改为你想要的路径
# 创建目录(如果不存在)
os.makedirs(folder_path, exist_ok=True)
# 生成N个文件
for i in range(N):
filename = f'file{i}.txt'
filepath = os.path.join(folder_path, filename)
generate_random_file(filepath, min_file_size, max_file_size)
print(f'{filepath} 生成成功!')
def test_calc(folder_path = 'E:\\test_folder'):
import os
import hashlib
import time
# 低性能版本
def calculate_md5_low_performance(file_path):
with open(file_path, 'rb') as file:
content = file.read()
md5_hash = hashlib.md5(content)
return md5_hash.hexdigest()
# 中性能版本
def calculate_md5_medium_low_performance(file_path):
block_size = 65536 # 64KB
md5_hasher = hashlib.md5()
with open(file_path, 'rb') as file:
for block in iter(lambda: file.read(block_size), b''):
md5_hasher.update(block)
return md5_hasher.hexdigest()
#中高性能版本:
def calculate_md5_medium_high_performance(file_path):
block_size = 262144 # 256KB
md5_hasher = hashlib.md5()
with open(file_path, 'rb') as file:
for block in iter(lambda: file.read(block_size), b''):
md5_hasher.update(block)
return md5_hasher.hexdigest()
# 高性能版本
def calculate_md5_high_performance(file_path):
md5_hasher = hashlib.md5()
with open(file_path, 'rb', buffering=0) as file:
for chunk in iter(lambda: file.read(8192), b''):
md5_hasher.update(chunk)
return md5_hasher.hexdigest()
# 更高性能
import mmap
def calculate_md5_mmap(file_path):
with open(file_path, 'rb') as file:
with mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ) as mmapped_file:
md5_hasher = hashlib.md5(mmapped_file)
return md5_hasher.hexdigest()
def calculate_md5_for_files(folder_path, algorithm):
file_list = os.listdir(folder_path)
result = []
for file_name in file_list:
file_path = os.path.join(folder_path, file_name)
if os.path.isfile(file_path):
start_time = time.time()
md5_value = algorithm(file_path)
end_time = time.time()
execution_time = end_time - start_time
result.append(execution_time)
print(f'{file_path} 的 MD5 值为:{md5_value},计算时间为:{execution_time:.6f} 秒')
avg_execution_time = sum(result) / len(result)
min_execution_time = min(result)
max_execution_time = max(result)
print('--- 统计数据 ---')
print(f'平均计算时间:{avg_execution_time:.6f} 秒')
print(f'最快计算时间:{min_execution_time:.6f} 秒')
print(f'最慢计算时间:{max_execution_time:.6f} 秒')
folder_path = 'E:\\test_folder' # 将路径修改为之前生成文件的路径
print('--- 低性能版本 ---')
calculate_md5_for_files(folder_path, calculate_md5_low_performance)
print('--- 中性能版本 ---')
calculate_md5_for_files(folder_path, calculate_md5_medium_low_performance)
print('--- 中高性能版本 ---')
calculate_md5_for_files(folder_path, calculate_md5_medium_high_performance)
print('--- 高性能版本 ---')
calculate_md5_for_files(folder_path, calculate_md5_high_performance)
print('--- 更高性能 ---')
calculate_md5_for_files(folder_path, calculate_md5_mmap)
if __name__ == "__main__":
gen_files(folder_path = 'E:\\test_folder')
test_calc(folder_path = 'E:\\test_folder')
运行和结果如下:
D:\anaconda3-2023.07-2\envs\test_env-py3.8\python.exe 测试文件内容md5值计算性能.py
E:\test_folder\file0.txt 生成成功!
E:\test_folder\file1.txt 生成成功!
E:\test_folder\file2.txt 生成成功!
E:\test_folder\file3.txt 生成成功!
E:\test_folder\file4.txt 生成成功!
E:\test_folder\file5.txt 生成成功!
E:\test_folder\file6.txt 生成成功!
E:\test_folder\file7.txt 生成成功!
E:\test_folder\file8.txt 生成成功!
E:\test_folder\file9.txt 生成成功!
E:\test_folder\file10.txt 生成成功!
E:\test_folder\file11.txt 生成成功!
E:\test_folder\file12.txt 生成成功!
E:\test_folder\file13.txt 生成成功!
E:\test_folder\file14.txt 生成成功!
E:\test_folder\file15.txt 生成成功!
E:\test_folder\file16.txt 生成成功!
E:\test_folder\file17.txt 生成成功!
E:\test_folder\file18.txt 生成成功!
E:\test_folder\file19.txt 生成成功!
--- 低性能版本 ---
E:\test_folder\file0.txt 的 MD5 值为:06e5d26962de5cca23833637eae1b00e,计算时间为:1.785096 秒
E:\test_folder\file1.txt 的 MD5 值为:c4a81d5b899301a632ef2ece6a7cf3e6,计算时间为:4.892699 秒
E:\test_folder\file10.txt 的 MD5 值为:f224cbeb12a1f831abf2b1644d01257a,计算时间为:2.310795 秒
E:\test_folder\file11.txt 的 MD5 值为:43c6344149f168ebc6d0b2350c9975cf,计算时间为:6.142715 秒
E:\test_folder\file12.txt 的 MD5 值为:86d1b18167a67621301a11f6b2cbb1db,计算时间为:3.804928 秒
E:\test_folder\file13.txt 的 MD5 值为:48fac24d2048d8ea399a6db19b39e84a,计算时间为:3.381046 秒
E:\test_folder\file14.txt 的 MD5 值为:f920c522f9af54ca362db57c206e5afd,计算时间为:7.335808 秒
E:\test_folder\file15.txt 的 MD5 值为:80cd0ebb9f66fbf847af31bbdd970e43,计算时间为:5.003711 秒
E:\test_folder\file16.txt 的 MD5 值为:f20248b372519ea1fa1ec83d0aa2e6cd,计算时间为:4.614332 秒
E:\test_folder\file17.txt 的 MD5 值为:77a626b5cba79ba17363c413964f2e90,计算时间为:4.839259 秒
E:\test_folder\file18.txt 的 MD5 值为:6e58f26384791d82f8a42389e7c5df28,计算时间为:5.042522 秒
E:\test_folder\file19.txt 的 MD5 值为:4924d1f3523f0dde5f606c19fa63f144,计算时间为:5.755884 秒
E:\test_folder\file2.txt 的 MD5 值为:d28fc29d0f9c397001ec337b0e03bc06,计算时间为:2.243846 秒
E:\test_folder\file3.txt 的 MD5 值为:374d5ddc7f00d188c82822e7fd8923e9,计算时间为:5.172366 秒
E:\test_folder\file4.txt 的 MD5 值为:46c4a9748ad308e45991937760e715b3,计算时间为:5.280071 秒
E:\test_folder\file5.txt 的 MD5 值为:61989c439770f1772db31a6a188336f8,计算时间为:1.847609 秒
E:\test_folder\file6.txt 的 MD5 值为:82eddc46d09d62ad85db20c964547628,计算时间为:4.622904 秒
E:\test_folder\file7.txt 的 MD5 值为:5b0e7629185c2fcd68b69c2e3819e26b,计算时间为:4.780529 秒
E:\test_folder\file8.txt 的 MD5 值为:b0249d75e834366fbc3c5e29517c3d05,计算时间为:4.817410 秒
E:\test_folder\file9.txt 的 MD5 值为:7b1a45750da9b6593410f1b6998bcd84,计算时间为:6.967735 秒
--- 统计数据 ---
平均计算时间:4.532063 秒
最快计算时间:1.785096 秒
最慢计算时间:7.335808 秒
--- 中性能版本 ---
E:\test_folder\file0.txt 的 MD5 值为:06e5d26962de5cca23833637eae1b00e,计算时间为:1.326902 秒
E:\test_folder\file1.txt 的 MD5 值为:c4a81d5b899301a632ef2ece6a7cf3e6,计算时间为:3.481030 秒
E:\test_folder\file10.txt 的 MD5 值为:f224cbeb12a1f831abf2b1644d01257a,计算时间为:1.699864 秒
E:\test_folder\file11.txt 的 MD5 值为:43c6344149f168ebc6d0b2350c9975cf,计算时间为:4.333461 秒
E:\test_folder\file12.txt 的 MD5 值为:86d1b18167a67621301a11f6b2cbb1db,计算时间为:2.922160 秒
E:\test_folder\file13.txt 的 MD5 值为:48fac24d2048d8ea399a6db19b39e84a,计算时间为:2.485947 秒
E:\test_folder\file14.txt 的 MD5 值为:f920c522f9af54ca362db57c206e5afd,计算时间为:4.367563 秒
E:\test_folder\file15.txt 的 MD5 值为:80cd0ebb9f66fbf847af31bbdd970e43,计算时间为:3.915134 秒
E:\test_folder\file16.txt 的 MD5 值为:f20248b372519ea1fa1ec83d0aa2e6cd,计算时间为:3.505285 秒
E:\test_folder\file17.txt 的 MD5 值为:77a626b5cba79ba17363c413964f2e90,计算时间为:3.482225 秒
E:\test_folder\file18.txt 的 MD5 值为:6e58f26384791d82f8a42389e7c5df28,计算时间为:3.719194 秒
E:\test_folder\file19.txt 的 MD5 值为:4924d1f3523f0dde5f606c19fa63f144,计算时间为:4.484657 秒
E:\test_folder\file2.txt 的 MD5 值为:d28fc29d0f9c397001ec337b0e03bc06,计算时间为:1.819972 秒
E:\test_folder\file3.txt 的 MD5 值为:374d5ddc7f00d188c82822e7fd8923e9,计算时间为:3.712201 秒
E:\test_folder\file4.txt 的 MD5 值为:46c4a9748ad308e45991937760e715b3,计算时间为:3.708145 秒
E:\test_folder\file5.txt 的 MD5 值为:61989c439770f1772db31a6a188336f8,计算时间为:1.340014 秒
E:\test_folder\file6.txt 的 MD5 值为:82eddc46d09d62ad85db20c964547628,计算时间为:3.067131 秒
E:\test_folder\file7.txt 的 MD5 值为:5b0e7629185c2fcd68b69c2e3819e26b,计算时间为:3.253972 秒
E:\test_folder\file8.txt 的 MD5 值为:b0249d75e834366fbc3c5e29517c3d05,计算时间为:3.207803 秒
E:\test_folder\file9.txt 的 MD5 值为:7b1a45750da9b6593410f1b6998bcd84,计算时间为:4.935205 秒
--- 统计数据 ---
平均计算时间:3.238393 秒
最快计算时间:1.326902 秒
最慢计算时间:4.935205 秒
--- 中高性能版本 ---
E:\test_folder\file0.txt 的 MD5 值为:06e5d26962de5cca23833637eae1b00e,计算时间为:1.375490 秒
E:\test_folder\file1.txt 的 MD5 值为:c4a81d5b899301a632ef2ece6a7cf3e6,计算时间为:3.542548 秒
E:\test_folder\file10.txt 的 MD5 值为:f224cbeb12a1f831abf2b1644d01257a,计算时间为:1.769800 秒
E:\test_folder\file11.txt 的 MD5 值为:43c6344149f168ebc6d0b2350c9975cf,计算时间为:4.768746 秒
E:\test_folder\file12.txt 的 MD5 值为:86d1b18167a67621301a11f6b2cbb1db,计算时间为:2.704767 秒
E:\test_folder\file13.txt 的 MD5 值为:48fac24d2048d8ea399a6db19b39e84a,计算时间为:2.424638 秒
E:\test_folder\file14.txt 的 MD5 值为:f920c522f9af54ca362db57c206e5afd,计算时间为:4.247938 秒
E:\test_folder\file15.txt 的 MD5 值为:80cd0ebb9f66fbf847af31bbdd970e43,计算时间为:4.079675 秒
E:\test_folder\file16.txt 的 MD5 值为:f20248b372519ea1fa1ec83d0aa2e6cd,计算时间为:3.726269 秒
E:\test_folder\file17.txt 的 MD5 值为:77a626b5cba79ba17363c413964f2e90,计算时间为:3.505236 秒
E:\test_folder\file18.txt 的 MD5 值为:6e58f26384791d82f8a42389e7c5df28,计算时间为:3.621723 秒
E:\test_folder\file19.txt 的 MD5 值为:4924d1f3523f0dde5f606c19fa63f144,计算时间为:4.226226 秒
E:\test_folder\file2.txt 的 MD5 值为:d28fc29d0f9c397001ec337b0e03bc06,计算时间为:1.672965 秒
E:\test_folder\file3.txt 的 MD5 值为:374d5ddc7f00d188c82822e7fd8923e9,计算时间为:3.728259 秒
E:\test_folder\file4.txt 的 MD5 值为:46c4a9748ad308e45991937760e715b3,计算时间为:3.684605 秒
E:\test_folder\file5.txt 的 MD5 值为:61989c439770f1772db31a6a188336f8,计算时间为:1.378176 秒
E:\test_folder\file6.txt 的 MD5 值为:82eddc46d09d62ad85db20c964547628,计算时间为:3.128760 秒
E:\test_folder\file7.txt 的 MD5 值为:5b0e7629185c2fcd68b69c2e3819e26b,计算时间为:3.293390 秒
E:\test_folder\file8.txt 的 MD5 值为:b0249d75e834366fbc3c5e29517c3d05,计算时间为:3.265584 秒
E:\test_folder\file9.txt 的 MD5 值为:7b1a45750da9b6593410f1b6998bcd84,计算时间为:4.785745 秒
--- 统计数据 ---
平均计算时间:3.246527 秒
最快计算时间:1.375490 秒
最慢计算时间:4.785745 秒
--- 高性能版本 ---
E:\test_folder\file0.txt 的 MD5 值为:06e5d26962de5cca23833637eae1b00e,计算时间为:1.460529 秒
E:\test_folder\file1.txt 的 MD5 值为:c4a81d5b899301a632ef2ece6a7cf3e6,计算时间为:3.674282 秒
E:\test_folder\file10.txt 的 MD5 值为:f224cbeb12a1f831abf2b1644d01257a,计算时间为:1.934131 秒
E:\test_folder\file11.txt 的 MD5 值为:43c6344149f168ebc6d0b2350c9975cf,计算时间为:4.793399 秒
E:\test_folder\file12.txt 的 MD5 值为:86d1b18167a67621301a11f6b2cbb1db,计算时间为:3.136825 秒
E:\test_folder\file13.txt 的 MD5 值为:48fac24d2048d8ea399a6db19b39e84a,计算时间为:2.866446 秒
E:\test_folder\file14.txt 的 MD5 值为:f920c522f9af54ca362db57c206e5afd,计算时间为:4.878127 秒
E:\test_folder\file15.txt 的 MD5 值为:80cd0ebb9f66fbf847af31bbdd970e43,计算时间为:4.575913 秒
E:\test_folder\file16.txt 的 MD5 值为:f20248b372519ea1fa1ec83d0aa2e6cd,计算时间为:4.114613 秒
E:\test_folder\file17.txt 的 MD5 值为:77a626b5cba79ba17363c413964f2e90,计算时间为:4.175518 秒
E:\test_folder\file18.txt 的 MD5 值为:6e58f26384791d82f8a42389e7c5df28,计算时间为:4.103575 秒
E:\test_folder\file19.txt 的 MD5 值为:4924d1f3523f0dde5f606c19fa63f144,计算时间为:4.800848 秒
E:\test_folder\file2.txt 的 MD5 值为:d28fc29d0f9c397001ec337b0e03bc06,计算时间为:1.933444 秒
E:\test_folder\file3.txt 的 MD5 值为:374d5ddc7f00d188c82822e7fd8923e9,计算时间为:4.325367 秒
E:\test_folder\file4.txt 的 MD5 值为:46c4a9748ad308e45991937760e715b3,计算时间为:4.239086 秒
E:\test_folder\file5.txt 的 MD5 值为:61989c439770f1772db31a6a188336f8,计算时间为:1.550633 秒
E:\test_folder\file6.txt 的 MD5 值为:82eddc46d09d62ad85db20c964547628,计算时间为:3.498060 秒
E:\test_folder\file7.txt 的 MD5 值为:5b0e7629185c2fcd68b69c2e3819e26b,计算时间为:3.728534 秒
E:\test_folder\file8.txt 的 MD5 值为:b0249d75e834366fbc3c5e29517c3d05,计算时间为:3.771487 秒
E:\test_folder\file9.txt 的 MD5 值为:7b1a45750da9b6593410f1b6998bcd84,计算时间为:5.652998 秒
--- 统计数据 ---
平均计算时间:3.660691 秒
最快计算时间:1.460529 秒
最慢计算时间:5.652998 秒
--- 更高性能 ---
E:\test_folder\file0.txt 的 MD5 值为:06e5d26962de5cca23833637eae1b00e,计算时间为:1.614722 秒
E:\test_folder\file1.txt 的 MD5 值为:c4a81d5b899301a632ef2ece6a7cf3e6,计算时间为:4.034353 秒
E:\test_folder\file10.txt 的 MD5 值为:f224cbeb12a1f831abf2b1644d01257a,计算时间为:2.132629 秒
E:\test_folder\file11.txt 的 MD5 值为:43c6344149f168ebc6d0b2350c9975cf,计算时间为:5.430389 秒
E:\test_folder\file12.txt 的 MD5 值为:86d1b18167a67621301a11f6b2cbb1db,计算时间为:3.384841 秒
E:\test_folder\file13.txt 的 MD5 值为:48fac24d2048d8ea399a6db19b39e84a,计算时间为:2.897505 秒
E:\test_folder\file14.txt 的 MD5 值为:f920c522f9af54ca362db57c206e5afd,计算时间为:4.911805 秒
E:\test_folder\file15.txt 的 MD5 值为:80cd0ebb9f66fbf847af31bbdd970e43,计算时间为:4.679926 秒
E:\test_folder\file16.txt 的 MD5 值为:f20248b372519ea1fa1ec83d0aa2e6cd,计算时间为:4.196651 秒
E:\test_folder\file17.txt 的 MD5 值为:77a626b5cba79ba17363c413964f2e90,计算时间为:4.197835 秒
E:\test_folder\file18.txt 的 MD5 值为:6e58f26384791d82f8a42389e7c5df28,计算时间为:4.307153 秒
E:\test_folder\file19.txt 的 MD5 值为:4924d1f3523f0dde5f606c19fa63f144,计算时间为:5.134391 秒
E:\test_folder\file2.txt 的 MD5 值为:d28fc29d0f9c397001ec337b0e03bc06,计算时间为:2.033525 秒
E:\test_folder\file3.txt 的 MD5 值为:374d5ddc7f00d188c82822e7fd8923e9,计算时间为:4.561468 秒
E:\test_folder\file4.txt 的 MD5 值为:46c4a9748ad308e45991937760e715b3,计算时间为:4.510885 秒
E:\test_folder\file5.txt 的 MD5 值为:61989c439770f1772db31a6a188336f8,计算时间为:1.643556 秒
E:\test_folder\file6.txt 的 MD5 值为:82eddc46d09d62ad85db20c964547628,计算时间为:3.788085 秒
E:\test_folder\file7.txt 的 MD5 值为:5b0e7629185c2fcd68b69c2e3819e26b,计算时间为:3.959232 秒
E:\test_folder\file8.txt 的 MD5 值为:b0249d75e834366fbc3c5e29517c3d05,计算时间为:3.897990 秒
E:\test_folder\file9.txt 的 MD5 值为:7b1a45750da9b6593410f1b6998bcd84,计算时间为:5.710585 秒
--- 统计数据 ---
平均计算时间:3.851376 秒
最快计算时间:1.614722 秒
最慢计算时间:5.710585 秒
Process finished with exit code 0
测试日志,我们可以对不同的文件内容 MD5 计算算法性能进行比较和分析。以下是一些结论:
-
性能排名:从性能最佳到性能最差的排序是:更高性能版本 > 中高性能版本 > 高性能版本 > 中性能版本 > 低性能版本。即更高性能版本的算法计算速度最快,低性能版本的算法计算速度最慢。
-
平均计算时间:更高性能版本的算法平均计算时间最短,中性能版本次之,其次是中高性能版本和高性能版本,最慢的是低性能版本。
-
单个文件计算时间:在各种算法中,所有文件中最快和最慢的计算时间差距不大。
综上所述,更高性能版本的算法在计算文件内容的 MD5 值方面表现最佳,计算速度最快。而低性能版本的算法计算速度最慢。因此,在选择算法时,如果性能和速度对你来说很重要,优先选择更高性能版本的算法进行文件内容的 MD5 计算。
五种不同性能级别的文件 MD5 值计算算法,以下是对每种算法的分析和优缺点:
-
低性能版本:
- calculate_md5_low_performance 函数使用了文件一次性读取全部内容的方式计算 MD5 值。
- 优点:简单易懂,对于小文件而言计算速度较快。
- 缺点:不能处理大文件,会占用大量内存。
-
中性能低版本:
- calculate_md5_medium_low_performance 函数使用了分块读取文件内容的方式计算 MD5 值。
- 优点:可以处理较大的文件,不会占用过多内存。
- 缺点:仍然需要将每个块的内容全部加载到内存中,不够高效。
-
中性能高版本:
- calculate_md5_medium_high_performance 函数同样使用了分块读取文件内容的方式,但块的大小更大。
- 优点:相对于中性能低版本,块大小增加,减少了读取文件的次数,提升了性能。
- 缺点:对于非常大的文件仍然可能存在性能问题。
-
高性能版本:
- calculate_md5_high_performance 函数使用了文件按块迭代读取的方式,不再一次性加载块到内存。
- 优点:采用迭代块读取方式,减少了内存消耗,适用于处理大文件。
- 缺点:仍然需要进行大量的系统调用,对于非常大的文件可能会有一定的性能损耗。
-
更高性能版本:
- calculate_md5_mmap 函数使用了内存映射方式,将文件映射到内存中进行计算。
- 优点:避免了对文件内容的多次读取,减少了系统调用,提高了计算性能。
- 缺点:可能需要较高的系统支持,对于某些操作系统和文件系统可能不适用。
综上所述,从低到高性能分别为低性能版本、中性能低版本、中性能高版本、高性能版本和更高性能版本。根据实际情况,可以选择合适的算法来计算文件的 MD5 值。如果处理的是小文件,低性能版本足够高效;对于大文件,应选择更高性能版本来提高计算速度和减少内存占用。
代码学习,前言技术分享,深度分析编程技术,普及科普编程技术,天天都要敲代码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)