Pyodide WebAssembly环境
Pyodide WebAssembly 环境 中运行,这个环境不支持执行系统命令(subprocess),错误信息显示 Function not implemented。
在 Pyodide 环境中,我们需要使用纯 Python 的方法来进行性能测试。以下是专门为 Pyodide 环境适配的版本:
Pyodide 专用性能测试程序
#!/usr/bin/env python3
import time
import datetime
import os
import sys
import math
class PyodidePerformanceTester:
def __init__(self, log_file="pyodide_performance.log"):
self.log_file_path = log_file
self.start_time = time.time()
def cpu_performance_test(self, log_file):
"""CPU 性能测试 - 纯 Python 实现"""
log_file.write("CPU PERFORMANCE TEST\n")
log_file.write("-" * 40 + "\n")
# 测试1: 素数计算
start_time = time.time()
prime_count = 0
for i in range(2, 10000):
if self.is_prime(i):
prime_count += 1
prime_time = time.time() - start_time
log_file.write(f"Prime calculation (up to 10,000): {prime_time:.3f} seconds\n")
log_file.write(f"Primes found: {prime_count}\n")
# 测试2: 浮点运算
start_time = time.time()
total = 0
for i in range(1000000):
total += math.sin(i * 0.001) * math.cos(i * 0.001)
float_time = time.time() - start_time
log_file.write(f"Float operations (1M): {float_time:.3f} seconds\n")
log_file.write(f"Result: {total:.6f}\n")
# 测试3: 整数运算
start_time = time.time()
factorial_result = 1
for i in range(1, 1000):
factorial_result = (factorial_result * i) % 1000000
int_time = time.time() - start_time
log_file.write(f"Integer operations: {int_time:.3f} seconds\n")
log_file.write(f"Factorial mod result: {factorial_result}\n")
log_file.write("-" * 40 + "\n\n")
def is_prime(self, n):
"""判断是否为素数"""
if n < 2:
return False
for i in range(2, int(math.sqrt(n)) + 1):
if n % i == 0:
return False
return True
def memory_performance_test(self, log_file):
"""内存性能测试"""
log_file.write("MEMORY PERFORMANCE TEST\n")
log_file.write("-" * 40 + "\n")
# 测试内存分配速度
start_time = time.time()
test_list = []
for i in range(100000):
test_list.append(i * i)
list_time = time.time() - start_time
log_file.write(f"List allocation (100K items): {list_time:.3f} seconds\n")
# 测试字典性能
start_time = time.time()
test_dict = {}
for i in range(100000):
test_dict[i] = f"value_{i}"
dict_time = time.time() - start_time
log_file.write(f"Dict allocation (100K items): {dict_time:.3f} seconds\n")
# 内存使用信息(在Pyodide中有限)
log_file.write(f"List memory usage: {sys.getsizeof(test_list)} bytes\n")
log_file.write(f"Dict memory usage: {sys.getsizeof(test_dict)} bytes\n")
# 清理内存
del test_list
del test_dict
log_file.write("-" * 40 + "\n\n")
def string_operations_test(self, log_file):
"""字符串操作性能测试"""
log_file.write("STRING OPERATIONS TEST\n")
log_file.write("-" * 40 + "\n")
# 字符串连接测试
start_time = time.time()
result = ""
for i in range(10000):
result += f"text_{i} "
concat_time = time.time() - start_time
log_file.write(f"String concatenation (10K): {concat_time:.3f} seconds\n")
# 字符串处理测试
start_time = time.time()
test_string = "Hello World! " * 1000
upper_count = sum(1 for c in test_string if c.isupper())
lower_count = sum(1 for c in test_string if c.islower())
process_time = time.time() - start_time
log_file.write(f"String processing: {process_time:.3f} seconds\n")
log_file.write(f"Uppercase letters: {upper_count}\n")
log_file.write(f"Lowercase letters: {lower_count}\n")
log_file.write("-" * 40 + "\n\n")
def file_io_test(self, log_file):
"""文件 I/O 性能测试"""
log_file.write("FILE I/O PERFORMANCE TEST\n")
log_file.write("-" * 40 + "\n")
test_filename = "test_io_file.txt"
# 写入测试
start_time = time.time()
with open(test_filename, 'w') as f:
for i in range(10000):
f.write(f"Line {i}: This is a test line for I/O performance testing.\n")
write_time = time.time() - start_time
log_file.write(f"File write (10K lines): {write_time:.3f} seconds\n")
# 读取测试
start_time = time.time()
line_count = 0
with open(test_filename, 'r') as f:
for line in f:
line_count += 1
read_time = time.time() - start_time
log_file.write(f"File read (10K lines): {read_time:.3f} seconds\n")
log_file.write(f"Lines read: {line_count}\n")
# 文件大小
file_size = os.path.getsize(test_filename)
log_file.write(f"File size: {file_size} bytes\n")
# 清理测试文件
if os.path.exists(test_filename):
os.remove(test_filename)
log_file.write("-" * 40 + "\n\n")
def system_info(self, log_file):
"""系统信息收集"""
log_file.write("SYSTEM INFORMATION\n")
log_file.write("-" * 40 + "\n")
log_file.write(f"Python version: {sys.version}\n")
log_file.write(f"Platform: {sys.platform}\n")
log_file.write(f"Current directory: {os.getcwd()}\n")
log_file.write(f"Available modules: {len(sys.modules)} loaded\n")
# Pyodide 特定信息
try:
import pyodide
log_file.write(f"Pyodide version: {pyodide.__version__}\n")
except ImportError:
log_file.write("Environment: Standard Python (not Pyodide)\n")
log_file.write("-" * 40 + "\n\n")
def run_all_tests(self):
"""运行所有测试"""
print("Starting Pyodide Performance Tests...")
print(f"Log file: {self.log_file_path}")
with open(self.log_file_path, 'w', encoding='utf-8') as log_file:
# 头部信息
log_file.write("PYODIDE PERFORMANCE TEST REPORT\n")
log_file.write("=" * 50 + "\n")
log_file.write(f"Test started: {datetime.datetime.now()}\n")
log_file.write(f"Environment: Pyodide/WebAssembly\n")
log_file.write("=" * 50 + "\n\n")
# 运行各个测试
tests = [
("System Info", self.system_info),
("CPU Performance", self.cpu_performance_test),
("Memory Performance", self.memory_performance_test),
("String Operations", self.string_operations_test),
("File I/O", self.file_io_test),
]
for test_name, test_func in tests:
print(f"Running {test_name}...")
try:
test_func(log_file)
log_file.flush() # 确保立即写入
print(f" ✓ {test_name} completed")
except Exception as e:
log_file.write(f"ERROR in {test_name}: {str(e)}\n")
print(f" ✗ {test_name} failed: {e}")
# 测试总结
end_time = time.time()
duration = end_time - self.start_time
log_file.write("\n" + "=" * 50 + "\n")
log_file.write("TEST SUMMARY\n")
log_file.write("=" * 50 + "\n")
log_file.write(f"Total duration: {duration:.2f} seconds\n")
log_file.write(f"Tests completed: {len(tests)}\n")
log_file.write(f"Test finished: {datetime.datetime.now()}\n")
print(f"\n✅ Performance test completed!")
print(f"📁 Log file: {self.log_file_path}")
# 显示日志文件内容
self.show_log_preview()
def show_log_preview(self):
"""显示日志文件预览"""
if os.path.exists(self.log_file_path):
print(f"\n📄 Log file preview:")
print("-" * 50)
with open(self.log_file_path, 'r', encoding='utf-8') as f:
for i, line in enumerate(f):
if i < 25: # 显示前25行
print(line.rstrip())
else:
print("... (more content in log file)")
break
else:
print("❌ Log file not found!")
def main():
"""主函数"""
print("=== Pyodide Performance Test ===")
print("This version uses pure Python (no system commands)")
tester = PyodidePerformanceTester("pyodide_performance.log")
tester.run_all_tests()
if __name__ == "__main__":
main()
快速测试版本
# 快速测试 Pyodide 环境的基本功能
import time
import math
def quick_pyodide_test():
"""快速性能测试"""
print("Quick Pyodide Performance Test")
print("=" * 40)
# CPU 测试
start = time.time()
result = sum(math.sin(i * 0.001) for i in range(100000))
cpu_time = time.time() - start
print(f"CPU (100K sin): {cpu_time:.3f}s")
print(f"Result: {result:.6f}")
# 内存测试
start = time.time()
data = [i * i for i in range(50000)]
mem_time = time.time() - start
print(f"Memory (50K list): {mem_time:.3f}s")
# 文件测试
start = time.time()
with open("quick_test.txt", "w") as f:
f.write("Pyodide test file\n" * 1000)
file_time = time.time() - start
print(f"File I/O: {file_time:.3f}s")
print("=" * 40)
print("Test completed!")
# 运行快速测试
quick_pyodide_test()
使用方法
- 运行完整测试:
tester = PyodidePerformanceTester()
tester.run_all_tests()
Starting Pyodide Performance Tests...
Log file: pyodide_performance.log
Running System Info...
✓ System Info completed
Running CPU Performance...
✓ CPU Performance completed
Running Memory Performance...
✓ Memory Performance completed
Running String Operations...
✓ String Operations completed
Running File I/O...
✓ File I/O completed
✅ Performance test completed!
📁 Log file: pyodide_performance.log
📄 Log file preview:
--------------------------------------------------
PYODIDE PERFORMANCE TEST REPORT
==================================================
Test started: 2025-11-12 10:41:37.206000
Environment: Pyodide/WebAssembly
==================================================
SYSTEM INFORMATION
----------------------------------------
Python version: 3.10.2 (main, Jan 25 2023, 18:32:53) [Clang 16.0.0 (https://github.com/llvm/llvm-project dee009d3b5c71a340eb4ebb3cfb4
Platform: emscripten
Current directory: /home/pyodide
Available modules: 729 loaded
Pyodide version: 0.22.1
----------------------------------------
CPU PERFORMANCE TEST
----------------------------------------
Prime calculation (up to 10,000): 0.023 seconds
Primes found: 1229
Float operations (1M): 0.721 seconds
Result: 341.632263
Integer operations: 0.000 seconds
Factorial mod result: 0
----------------------------------------
... (more content in log file)
- 运行快速测试:
quick_pyodide_test()
Quick Pyodide Performance Test
========================================
CPU (100K sin): 0.037s
Result: 137.934299
Memory (50K list): 0.004s
File I/O: 0.000s
========================================
Test completed!
这个版本完全使用纯 Python,不依赖任何系统命令,专门为 Pyodide WebAssembly 环境设计。现在应该可以正常工作了!

浙公网安备 33010602011771号