Monday, July 21, 2014

Python performance tips: removing files

На одному з проектів  була потреба працювати  з величезною кількістю файлів ( специфіка бази даних ), і аналогічно на додачу до того постійно створювалися тимчасові файли в великій кількості. Звичайно ж час життя цих всіх файлів жостко контролювався із пітончика :)

А ось тепер задачка - є приблизно 10 тисяч файликів , які потрібно прочитати ( по-чергово звісно ) опрацювати і видалити - який буде результуючий перфоменс ? Ну ок, обробка інфи в файлах неважлива - ми нівелюємо цей аспект:) Ну ок - про читання теж саме ( хоча там теж є свої особливості... Я ось більше про саму операцію ремув питаю - як думаєте наскільки вона впливає на перфоменс?

Давайте візьмем маленький приклад - ремувати будемо ось так

import os

os.remove(path/to/file) 


але для великої кількості файлів - кількадесять тисяч, чи буде це гарним варіантом?

берем генерим для прикладу дві тисячі файлів, заходимо в директорію до файлів
і виконуємо скрипт:

from os import remove

from os import listdir

from time import time



start = time()

for item in listdir('.'):

    remove(item)

print time() - start


і в результаті отримуємо

0.551357030869

в принціпі небагато
Для прикладу можемо порівняти з більш низькорівнемої функцією - unlink
Та сама вибірка і кількість файлів, виконуємо скриптец

from posix import unlink

from os import listdir

from time import time



start = time()

for item in listdir('.'):

    unlink(item)

print time() - start


результат:

0.733736991882

Типу все круто - і гарно працює, але насправді нам було того мало , і ми вирішили збілдати Cython екстеншин для покращення перфоменсу , ( на цьому , ну і не тільки на цьому місці (^_^)  )
і при використанні коду скомпільованого з використанням os.remove(), отримав такі дані

0.779083967209

але найбільше здивував posix.unlink() , бо він виявився в 10 разів швидший

0.0869176957216
!!
Отже при викоритсанні низкорівневих штук з cython тільки на одному видаленні файлів отримав досить значне зростання перфоменсу, а як то кажуть - "Копійка гривню береже". Тут вдосконалили і можемо переміститися на іншу аспект покращення перфоменсу (=

UPD.  правда то все я тестив на ssd - тому на вінчестері звичайному можуть відрізнятися числа =(

0 comments:

Post a Comment