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()

使用方法

  1. 运行完整测试
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)
  1. 运行快速测试
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 环境设计。现在应该可以正常工作了!

posted @ 2025-11-12 10:43  aiplus  阅读(7)  评论(1)    收藏  举报
悬浮按钮示例