Оптимізація продуктивності: Тест швидкості Python для пошуку цифр у рядках
⛓️ У відповідь на оригінальний пост: читайте обговорення тут я раніше провів заміри тільки для однієї категорії - короткий текст, тепер продовження ...
🪜 Я провів експеримент для оцінки ефективності різних методів Python для пошуку цифр у рядках, з урахуванням різних довжин рядків від коротких до довгих. Нижче я порівнюю шість різних технік і їхні переваги при витягуванні цифр.
А також додано вимірювання продуктивності в різних версіях Python: 3.13.0 та 3.12.5
Категорії для тестування
Рядки були поділені на чотири окремі групи за їхньою довжиною:
- Short: Короткий рядок, що містить лише кілька символів.
- Middle: Рядок середнього розміру, приблизно 256 символів.
- Long (1KB): Довший рядок, приблизно 1 кілобайт, що імітує параграфи тексту.
- Long (2KB): Значно більший рядок, приблизно 2 кілобайти, підходить для даних, схожих на документи.
Методи порівняння
Нижче наведено шість версій методів витягування цифр, кожен з яких було проаналізовано за показниками продуктивності:
|
Шість версій для порівняння
|
1. Version 1: Manual Iteration with List and isdigit()
- Опис: Ітерує через кожен символ рядка, перевіряє, чи є це цифрою за допомогою
char.isdigit()
і додає його до списку.
- Продуктивність (3.13.0):
- Short: 3.37 секунд
- Middle: 1.12 хвилин
- Long (1KB): 4.13 хвилин
- Long (2KB): 9.71 хвилин
2. Version 2: List Comprehension with isdigit()
- Опис: Використовує list comprehension для фільтрації цифр, створюючи список цифр за одну лінію з використанням
char.isdigit()
.
- Продуктивність (3.13.0):
- Short: 3.23 секунд
- Middle: 1.04 хвилин
- Long (1KB): 3.89 хвилин
- Long (2KB): 9.24 хвилин
3. Version 3: filter
with str.isdigit
- Опис: Використовує функцію
filter
з str.isdigit
, яка безпосередньо фільтрує нецифрові символи і повертає відфільтрований ітератор.
- Продуктивність (3.13.0):
- Short: 2.86 секунд (Найшвидший)
- Middle: 36.56 секунд (Найшвидший)
- Long (1KB): 2.31 хвилин (Найшвидший)
- Long (2KB): 5.39 хвилин (Найшвидший)
4. Version 4: Regular Expression with re.findall
- Опис: Використовує регулярний вираз (
\d+
) для пошуку всіх послідовностей цифр у рядку, повертаючи список знайдених збігів.
- Продуктивність (3.13.0):
- Short: 4.42 секунд
- Middle: 47.71 секунд
- Long (1KB): 2.83 хвилин
- Long (2KB): 6.49 хвилин
5. Version 5: Precompiled Regular Expression with re.findall
- Опис: Використовує попередньо скомпільований шаблон регулярного виразу (
re.compile
) для повторних пошуків цифр з re.findall
, орієнтуючись на швидше виконання з компільованими патернами.
- Продуктивність (3.13.0):
- Short: 7.13 секунд
- Middle: 50.33 секунд
- Long (1KB): 2.87 хвилин
- Long (2KB): 6.53 хвилин
6. Version 6: Precompiled Regex with .findall
Method
- Опис: Використовує попередньо скомпільований шаблон регулярного виразу (
re.compile
) і метод .findall()
безпосередньо на рядку для витягування всіх послідовностей цифр.
- Продуктивність (3.13.0):
- Short: 2.93 секунд
- Middle: 45.87 секунд
- Long (1KB): 2.79 хвилин
- Long (2KB): 6.45 хвилин
Фінальна рекомендація
- Найкращий метод: Version 3 (
filter
з str.isdigit
) — безсумнівний лідер серед усіх методів.
- Чому: Він простий, читабельний і показує відмінні результати як для малих, так і для великих наборів даних.
Результати
% python main.py
Darwin_3.13.0, times=5000000, repeat=3
Category: 'short'
- Version 1. Time: ['3.4180', '3.3468', '3.3461'] avg: 3.3703 seconds. Result: 2024
- Version 2. Time: ['3.2680', '3.1936', '3.2276'] avg: 3.2297 seconds. Result: 2024
- Version 3. Time: ['2.8397', '2.8754', '2.8645'] avg: 2.8599 seconds. Result: 2024
- Version 4. Time: ['4.3639', '4.4486', '4.4417'] avg: 4.4181 seconds. Result: 2024
- Version 5. Time: ['7.0495', '7.1414', '7.1971'] avg: 7.1293 seconds. Result: 2024
- Version 6. Time: ['2.9280', '2.9187', '2.9319'] avg: 2.9262 seconds. Result: 2024
Category: 'middle-256'
- Version 1. Time: ['67.3783', '67.6979', '67.0671'] avg: 67.3811 seconds. Result: 202420240220240001202406151372024091043215672024122233
- Version 2. Time: ['62.9530', '62.5314', '62.0876'] avg: 62.5240 seconds. Result: 202420240220240001202406151372024091043215672024122233
- Version 3. Time: ['36.7012', '36.5057', '36.4587'] avg: 36.5552 seconds. Result: 202420240220240001202406151372024091043215672024122233
- Version 4. Time: ['47.7360', '47.7376', '47.6681'] avg: 47.7139 seconds. Result: 202420240220240001202406151372024091043215672024122233
- Version 5. Time: ['50.3733', '50.3510', '50.2714'] avg: 50.3319 seconds. Result: 202420240220240001202406151372024091043215672024122233
- Version 6. Time: ['45.8516', '45.9222', '45.8223'] avg: 45.8654 seconds. Result: 202420240220240001202406151372024091043215672024122233
Category: 'long-1k'
- Version 1. Time: ['247.6524', '247.7653', '247.7344'] avg: 247.7174 seconds. Result: 202420240101202412312024021520240310110012024202401202024202406302565678202420240705303506020240915789001232024080120241031202411052024121541252024998020242024123020251
- Version 2. Time: ['232.9952', '233.0520', '233.8286'] avg: 233.2919 seconds. Result: 202420240101202412312024021520240310110012024202401202024202406302565678202420240705303506020240915789001232024080120241031202411052024121541252024998020242024123020251
- Version 3. Time: ['138.3953', '138.7282', '138.7134'] avg: 138.6123 seconds. Result: 202420240101202412312024021520240310110012024202401202024202406302565678202420240705303506020240915789001232024080120241031202411052024121541252024998020242024123020251
- Version 4. Time: ['170.0998', '170.4189', '169.5901'] avg: 170.0362 seconds. Result: 202420240101202412312024021520240310110012024202401202024202406302565678202420240705303506020240915789001232024080120241031202411052024121541252024998020242024123020251
- Version 5. Time: ['172.2324', '172.1944', '172.1929'] avg: 172.2066 seconds. Result: 202420240101202412312024021520240310110012024202401202024202406302565678202420240705303506020240915789001232024080120241031202411052024121541252024998020242024123020251
- Version 6. Time: ['167.4107', '167.2363', '167.1903'] avg: 167.2791 seconds. Result: 202420240101202412312024021520240310110012024202401202024202406302565678202420240705303506020240915789001232024080120241031202411052024121541252024998020242024123020251
Category: 'long-2k'
- Version 1. Time: ['582.2415', '582.9876', '582.5370'] avg: 582.5887 seconds. Result: 202420242024010510012024020120240331202404151002244202405202024061015334562024070178912345567899882024080120240915202430352024100578902002024092520241015202410202108765202411012024112099013456202420241125654343212024121030020241220202501312025021020252024
- Version 2. Time: ['553.1481', '554.6678', '554.9689'] avg: 554.2616 seconds. Result: 202420242024010510012024020120240331202404151002244202405202024061015334562024070178912345567899882024080120240915202430352024100578902002024092520241015202410202108765202411012024112099013456202420241125654343212024121030020241220202501312025021020252024
- Version 3. Time: ['323.2028', '323.5094', '323.4390'] avg: 323.3837 seconds. Result: 202420242024010510012024020120240331202404151002244202405202024061015334562024070178912345567899882024080120240915202430352024100578902002024092520241015202410202108765202411012024112099013456202420241125654343212024121030020241220202501312025021020252024
- Version 4. Time: ['390.0178', '388.7353', '389.5589'] avg: 389.4373 seconds. Result: 202420242024010510012024020120240331202404151002244202405202024061015334562024070178912345567899882024080120240915202430352024100578902002024092520241015202410202108765202411012024112099013456202420241125654343212024121030020241220202501312025021020252024
- Version 5. Time: ['391.7042', '391.4870', '392.1666'] avg: 391.7859 seconds. Result: 202420242024010510012024020120240331202404151002244202405202024061015334562024070178912345567899882024080120240915202430352024100578902002024092520241015202410202108765202411012024112099013456202420241125654343212024121030020241220202501312025021020252024
- Version 6. Time: ['386.7376', '387.3923', '387.0871'] avg: 387.0723 seconds. Result: 202420242024010510012024020120240331202404151002244202405202024061015334562024070178912345567899882024080120240915202430352024100578902002024092520241015202410202108765202411012024112099013456202420241125654343212024121030020241220202501312025021020252024
Diagrams (3.13.0)
Категорії:
|
Short |
|
Middle 256 |
|
Long 1K |
|
Long 2K |
|
Всі категорії
|
Diagrams (3.12.5)
|
Python 3.12.5
|
Function Duration Metrics in Python 3.13.0
Function |
short |
middle-256 |
long-1k |
long-2k |
Version 1 |
3.37 s |
1.12 m |
4.13 m |
9.71 m |
Version 2 |
3.23 s |
1.04 m |
3.89 m |
9.24 m |
Version 3 |
2.86 s |
36.56 s |
2.31 m |
5.39 m |
Version 4 |
4.42 s |
47.71 s |
2.83 m |
6.49 m |
Version 5 |
7.13 s |
50.33 s |
2.87 m |
6.53 m |
Version 6 |
2.93 s |
45.87 s |
2.79 m |
6.45 m |
Function Duration Metrics in Python 3.12.5
Function |
short |
middle-256 |
long-1k |
long-2k |
Version 1 |
3.01 s |
51.65 s |
3.22 m |
7.54 m |
Version 2 |
2.93 s |
48.15 s |
3.08 m |
7.33 m |
Version 3 |
3.10 s |
37.44 s |
2.40 m |
5.66 m |
Version 4 |
4.96 s |
52.88 s |
3.08 m |
7.05 m |
Version 5 |
7.78 s |
55.65 s |
3.13 m |
7.17 m |
Version 6 |
3.19 s |
50.61 s |
3.04 m |
7.04 m |
CSV of duration differences (%) for Python 3.13.0 and 3.12.5
Function |
short |
middle-256 |
long-1k |
long-2k |
Version 1 |
11.96% |
29.44% |
28.21% |
28.78% |
Version 2 |
9.27% |
30.79% |
26.60% |
26.46% |
Version 3 |
-7.74% |
2.36% |
-3.75% |
-4.77% |
Version 4 |
-10.89% |
9.78% |
8.12% |
7.95% |
Version 5 |
-8.36% |
9.56% |
8.30% |
8.93% |
Version 6 |
-8.15% |
9.33% |
8.22% |
8.39% |
Посилання на проєкт:
Немає коментарів:
Дописати коментар