背景
最近在备战一场算法竞赛,语言误选了 Python ,无奈只能着手对常见场景进行语言迁移。而字符串查找的场景在算法竞赛中时有出现。本文即对此场景在 Python 和竞赛常用语言 C++ 下的速度进行对比,并提供相关参数和运行结果供他人参考。
参数
硬件和操作系统
-` root@<hostname> .o+` ------------ `ooo/ OS: Arch Linux ARM aarch64 `+oooo: Host: Raspberry Pi 4 Model B `+oooooo: Kernel: 5.16.12-1-aarch64-ARCH -+oooooo+: Uptime: 3 hours, 32 mins `/:-:++oooo+: Packages: 378 (pacman) `/++++/+++++++: Shell: zsh 5.8.1 `/++++++++++++++: Terminal: /dev/pts/0 `/+++ooooooooooooo/` CPU: (4) @ 1.500GHz ./ooosssso++osssssso+` Memory: 102MiB / 7797MiB .oossssso-````/ossssss+` -osssssso. :ssssssso. :osssssss/ osssso+++. /ossssssss/ +ssssooo/- `/ossssso+/:- -:/+osssso+- `+sso+:-` `.-/+oso: `++:. `-/+/ .` `/
编译环境和解释环境
- Python
- 解释器:Python 3.10.2 (main, Jan 23 2022, 21:20:14) [GCC 10.2.0] on linux
- 交互环境:IPython 8.0.1
- C++
g++ test.cpp -Wall -O2 -g -std=c++11 -o test
场景
本次实测设置两个场景:场景 1 的源串字符分布使用伪随机数生成器生成,表示字符串查找的平均情况;场景 2 的源串可连续分割成 20,000 个长度为 50 的字符片段,其中第 15,001 个即为模式串,形如“ab…b”(1 个“a”,49 个 “b”),其余的字符片段形如“ab…c”(1 个“a”,48 个“b”,1 个“c”)。
项目 | 场景 1:平均情况 | 场景 2:较坏情况 |
---|---|---|
字符集 | 小写字母 | abc |
字符分布 | random.choice |
有较强规律性 |
源串长度 | 1,000,000 | 1,000,000 |
模式串长度 | 1,000 | 50 |
模式串出现位置 | 250,000、500,000、750,000 | 750,000 |
模式串出现 |