当前位置: 首页 > news >正文

Python 测试代码

Python 虽然本身运行缓慢,但它的标准库并不慢,因此我选择它作为性能对比的基线:

import re
import time
import sys

def match_with_re(lines, compiled_re):
matches = 0
for line in lines:
if compiled_re.search(line):
matches += 1
return matches

def main():
filename = “test.data”

try: with open(filename, "r", encoding="utf-8") as f: lines = f.read().splitlines() except FileNotFoundError: print(f"无法打开文件: {filename}", file=sys.stderr) return print(f"文件读取完成。总行数: {len(lines)}\n") if not lines: return pattern = r'\"TSLA.*?\"' compiled_re = re.compile(pattern) iterations = 2 total_matches = 0 start_time = time.perf_counter() for _ in range(iterations): total_matches += match_with_re(lines, compiled_re) end_time = time.perf_counter() total_duration_secs = end_time - start_time total_duration_ms = total_duration_secs * 1000 avg_duration_ms = total_duration_ms / iterations print(f"[Python re 结果] -------") print(f"循环总次数: {iterations}") print(f"总耗时: {total_duration_ms:.2f} ms") print(f"单次扫描平均耗时: {avg_duration_ms:.4f} ms") print(f"累计匹配成功行数: {total_matches}")

ifname== “main”:
main()
测试结果
尽管只运行了两轮,但每个函数匹配的次数都在 1000 万次以上,足够摊平统计差异了。

下面是测试结果:

实现 总耗时 单次扫描平均耗时
Go regexp 1.771614875 s 885.8074 ms
Go regexp2go 1m27.618973125 s 43809.4866 ms
Python re 2038.25 ms 1019.1254 ms
std::regex 20775.7 ms 10387.8 ms
PCRE2 4625.82 ms 2312.91 ms
PCRE2 JIT 238.041 ms 119.02 ms
实现 总耗时倍率 单次扫描平均耗时倍率
Go regexp 0.87× 0.87×
Go regexp2go 43.02× 42.99×
Python re 1.00× 1.00×
std::regex 10.19× 10.19×
PCRE2 2.27× 2.27×
PCRE2 JIT 0.12× 0.12×
从结果来看,regexp2go 是最慢的。这个工具号称比 Go 1.16 的标准库最多快 5 倍,要么是 Go 的标准库有了飞跃式提升,要么是它夸大宣传。

C++ 标准库的 regex 慢是众所周知的,不过没想到会比 Python 基线慢一个数量级,令人捧腹。不同的标准库实现之间性能也是天差地别,我选用了最快的 libstdc++;如果换成 LLVM 的 libc++,性能会回退到和 regexp2go 一桌。除了慢之外,标准库还有代码膨胀的问题,仅仅简单使用基础功能和一个不算复杂的模式,就产生了 200 KB 左右的编译产物。

令人意外的是,PCRE2 在未开启 JIT 时居然会比 Python 慢。这是因为对于非贪婪匹配,PCRE2 的引擎会比 Go 和 Python 做更多工作,最终导致速度变慢。

总结

http://www.jsqmd.com/news/1229088/

相关文章:

  • TinyMCE富文本编辑器:为技术团队提供高效内容创作解决方案
  • 2026年人保承保钢制柱型散热器生产厂家挑选攻略:鑫祥春暖通等优质企业梳理 - 每天一杯纯牛奶
  • Spring Boot 3 HTTP客户端替代Feign的实践指南
  • GitHub Copilot SDK工具权限管理:如何控制工具执行权限的完整指南 [特殊字符]️
  • 炉石传说技术增强插件HsMod:从游戏痛点到技术解决方案的完整指南
  • 数学学习终极指南:如何利用awesome-math资源库快速掌握数学核心概念
  • 2026 年临沂膜结构搭建撬装柜施工弧形大棚搭建本地施工厂家 TOP5 实测测评 - LYL仔仔
  • Vaadin Flow性能监控与调优:识别和解决瓶颈的实用工具
  • 沐曦股份选择 Gitee 企业版:从代码开源到算力实践,构建国产 GPU 开发生态
  • 如何在Linux桌面环境中全面部署Cyberpunk Neon主题:从GTK到Wayland的完整指南
  • 如何快速定制专属桌面宠物:5步创意设计完全指南
  • 2026 年青岛膜结构搭建 钢结构厂房搭建本地施工商家 TOP5 实测测评 - LYL仔仔
  • 5大智能升级:重新定义鸣潮游戏体验
  • React Native应用鸿蒙适配实战指南
  • 时间序列算法3---大模型-(6类聚类方法及数据处理量)
  • Apache Fury架构深度解析:多语言序列化框架的技术选型指南
  • Supertonic终极指南:打造本地化多语言语音合成的完整技术生态
  • Debian与Ubuntu核心技术差异与适用场景解析
  • 杭州不同品类黄金回收差价解析:金条、首饰、老金、K 金价格区别 - 奢侈品回收评测
  • 如何用30分钟构建你的AI金融分析大脑:TradingAgents-CN实战指南
  • Adapt Intent Parser生产环境部署:容器化、监控与扩展的最佳实践
  • 如何用AI工具永久保存你的微信聊天记忆:从数据提取到年度报告完整指南
  • 2026企业服务实测:AI品牌可见力全栈方案选型指南
  • 3步掌握macOS菜单栏终极整理术:Ice工具完全指南
  • 热修复技术:iOS-Tech-Weekly中的JSPatch与动态化方案深度解析
  • XCB库与wmutils/core:X窗口操作的底层技术解析与实用指南
  • django外键字段会自动在数据库字段后面加上_id
  • 3步掌握SpringBlade:从单体到微服务的平滑迁移终极指南
  • 2026年新疆昆仑雪菊怎么选?5家实测对比以及避坑推荐 - 中国远见品牌企业资讯
  • Checkra1n Windows版越狱工具使用指南与A12设备支持解析