使用Python测量PC与Android设备间文件拷贝的读写速度
实现手机与PC间文件传输测速的Python方案
核心思路
不管是哪方向的传输,核心都是记录文件传输的开始/结束时间,结合文件大小计算速度:速度 = 文件大小 / 传输耗时。具体实现分两种常见场景:手机存储挂载为PC本地磁盘,或是通过网络(WiFi/热点)传输。
场景1:手机存储挂载为PC本地磁盘
如果手机通过USB调试、MTP或USB大容量存储模式挂载成PC的本地盘符(比如Windows的E:、Linux的/mnt/phone),直接用Python内置模块即可完成测速。
示例代码(PC→手机)
import shutil import time import os def measure_transfer_speed(source_path, dest_path): # 获取文件大小(字节) file_size = os.path.getsize(source_path) start_time = time.time() # 执行文件复制 shutil.copy2(source_path, dest_path) end_time = time.time() elapsed = end_time - start_time # 转换为MB/s输出(1MB = 1024*1024字节) speed_mbs = (file_size / (1024*1024)) / elapsed print(f"传输完成!耗时:{elapsed:.2f}秒,速度:{speed_mbs:.2f} MB/s") # 替换为你的1GB测试文件路径和手机挂载路径 measure_transfer_speed("D:/test_1gb_file.bin", "E:/test_1gb_file.bin")
补充说明
- 1GB测试文件可快速生成:
with open("test_1gb_file.bin", "wb") as f: f.write(os.urandom(1024*1024*1024)) - MTP挂载存在系统缓存机制,建议重复3-5次测试取平均值,结果更准确。
场景2:通过网络传输(WiFi/热点)
如果是无线传输,用Python的socket模块建立TCP连接实现文件收发,无需挂载磁盘,适配iOS、安卓全平台。
方案1:PC作为服务器,手机接收文件(PC→手机)
PC端代码(发送文件并测速)
import socket import time import os def pc_server(file_path, host="0.0.0.0", port=9999): file_size = os.path.getsize(file_path) server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind((host, port)) server_socket.listen(1) print(f"等待手机连接... 监听端口:{port}") conn, addr = server_socket.accept() print(f"已连接设备:{addr}") # 先发送文件大小(8字节固定长度) conn.sendall(file_size.to_bytes(8, byteorder='big')) start_time = time.time() # 分块发送文件内容 with open(file_path, "rb") as f: while chunk := f.read(4096): conn.sendall(chunk) end_time = time.time() elapsed = end_time - start_time speed_mbs = (file_size / (1024*1024)) / elapsed print(f"文件发送完成!耗时:{elapsed:.2f}秒,速度:{speed_mbs:.2f} MB/s") conn.close() server_socket.close() # 替换为你的1GB测试文件路径 pc_server("D:/test_1gb_file.bin")
手机端代码(接收文件并测速)
手机需安装Python环境(比如安卓用Termux),运行以下代码:
import socket import time def phone_client(server_ip, port=9999, save_path="/sdcard/test_1gb_file.bin"): client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect((server_ip, port)) # 接收文件大小 file_size_bytes = client_socket.recv(8) file_size = int.from_bytes(file_size_bytes, byteorder='big') start_time = time.time() # 分块接收文件内容 received = 0 with open(save_path, "wb") as f: while received < file_size: chunk = client_socket.recv(min(4096, file_size - received)) if not chunk: break f.write(chunk) received += len(chunk) end_time = time.time() elapsed = end_time - start_time speed_mbs = (file_size / (1024*1024)) / elapsed print(f"文件接收完成!耗时:{elapsed:.2f}秒,速度:{speed_mbs:.2f} MB/s") client_socket.close() # 替换为PC的局域网IP phone_client("192.168.1.100")
方案2:手机作为服务器,PC接收文件(手机→PC)
只需反转上述收发逻辑:手机端监听端口并发送文件,PC端连接后接收并计时,代码结构与上述一致,调整收发顺序即可。
可选优化工具
tqdm:添加传输进度条,直观显示实时进度psutil:监控CPU、内存占用,排除系统资源瓶颈对测速结果的干扰
内容的提问来源于stack exchange,提问作者martin
相关产品推荐
相关产品推荐

