- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
from os import walk
from time import time
from abc import ABCMeta, abstractmethod
class Reporter(object):
__metaclass__=ABCMeta
@abstractmethod
def report(self, catalogs_cntr, files_ctnr, speed):
""" output catalogs_cntr, files_ctnr, speed to somewhere """
#pass
class ConsoleIndicator(Reporter):
def __init__(self, out_splitter):
self.__out_splitter=out_splitter
def report(self, catalogs_cntr, files_ctnr, speed):
if self.__out_splitter and self.__out_splitter.pipes:
_result = "\rcataloges:" + repr(catalogs_cntr).rjust(8)
_result += "\tfiles:" + repr(files_ctnr).rjust(13)
_result += "\tspeed: %12.3f"%speed + " files/s"
self.__out_splitter.write(_result)
self.__out_splitter.flush()
class CatalogsWalker(object):
""" """
def __init__(self, catalogs, reporter=None):
""" """
self.__files_cntr, self.__catalogs_cntr, self.__start_time, self.__speed = 0, 0, 0, 0
self.__reporter = reporter
self.__catalogs = catalogs if hasattr(catalogs, "__iter__") else [catalogs]
def __iter__(self):
self.__files_cntr, self.__catalogs_cntr, self.__start_time, self.__speed = 0, 0, 0, 0
self.__start_time=time()
for catalog in self.__catalogs:
print catalog
for p,d,ns in walk(catalog):
_ = d;
self.__catalogs_cntr+=1
for n in ns:
self.__files_cntr+=1
self.__speed=self.__files_cntr/(time()-self.__start_time)
if self.__reporter:
self.__reporter.report(self.__catalogs_cntr, self.__files_cntr, self.__speed)
yield p,n
@property
def reporter(self):
return self.__reporter
@property
def catalog_counter(self):
return self.__catalogs_cntr
@property
def file_counter(self):
return self.__files_cntr
@property
def start_time(self):
return self.__start_time
@property
def speed(self):
return self.__speed
По мотивам http://govnokod.ru/17181 Учтены замечания некого Анонимус http://govnokod.ru/17181#comment256577. Надеюсь что будут еще замечания, такие же конструктивные и полезные.
Зачем Вы место, где программисты собираются у костра для разговоров по душам, в мастерскую идеального кода превращаете? Начните уже развлекаться, что Вы серьёзный-то такой!
Это я. Как дела, как поживаешь?
Привет, Стертор. Давно не заходил к нам на огонёк.
ровно через 3 года зарегаю учётку. если не умру и не женюсь.
P.S. Заходите к нам почаще. Место около костра с видом на речку всё ещё пустует.
это в иной реальности. В именно этой реальности на ГК обсуждается все то, что интересно в данный момент.
Беседы на кухне отличная метафора. Так вот на кухне ни кто не будет тебя учить как надо. Ибо таких дел на работе достаточно. На хера еще своё личное время на это тратить.
Нахера.
1,5
directories или folders блджад.
> self.__files_cntr, self.__catalogs_cntr, self.__start_time, self.__speed = 0, 0, 0, 0
Прекрати экономить строки, содомит.
Насчет out_splitter'а: проверкой self.__out_splitter.pipes ты завязался на то, что там должен быть именно OutputSplitter. А нафига, если по смыслу тут любой поток с write и flush подходит?
Там все сложнее)) __out_splitter.pipes список pip(ов) и он может эти pipes и не иметь вовсе. Т.е. просто ничего не нужно выводить. А если ничего не нужно выводить, то нафига сложные манипуляции с _result строкой производить? да еще и пытаться это в никуда выводить?
Может ему будет удобнее сплиттер в виде пустого списка держать Зачем мне об этом думать? Моя задача перестраховаться в этом месте
Вот именно. Дёргал бы write в любом случае да и всё. Бутылочным горлышком эти сложения строк не должны стать.
P.S. Или ты погонял код под профайлером и выяснил, что при отправке в пустой OutputSplitter именно эта функция просаживает производительность?
Да ну... Ты же эти файлы скорее всего читать будешь, или в субд куда-нибудь вносить, в текстовый файлик писать, в конце-концов... Это же всё явно не ради подсчета файлов пилилось?
Имхо, лучше сделать троттлинг отчета - писать отчет в сплиттер не чаще раза в секунду, к примеру. От этого производительности будет явно больше, чем от проверки на пустой pipes. Да и юзеру приятней будет смотреть.
P.S. Под виндой терминал лагает как говно. Там именно он и будет bottleneck'ом. В линухе чуть лучше, но тоже запросто может упереться именно в него (сейчас затестим).
А про троттлинг, кстати, подумай. С ним вывод намного приятней смотрится - не бесконечно бегущий поток символов, а аккуратный отчетик каждую секунду (можно и реже, я обычно на 5-10 настраиваю). Бесплатная плюшка - форматирование строки раз в секунду вообще не напрягает, и можно забить на self.__out_splitter.pipes и прочие оптимизации.
> Слышал?
Ну.
Обычный человек, когда ложится спать, ставит на тумбочку стакан с водой на случай если он захочет пить. Программист ставит стакан с водой на случай если он захочет пить и пустой стакан на случай если он не захочет пить.
Надеюсь ты видишь связь этого "анекдота" c нашей дискуссией про pipes
>Но я там не звонки слал, а просто большой файлик случайно высрал в stdout.
Я - то же самое. Комп не вис, но висли **все** консоли.
Это я у вас учусь
Форматируешь тоже через жопу: И не экономь пробелы вокруг операторов, нечитабельно же (читай PEP-8, если мне не веришь).
Пожалуйста ;)
Только в срачло!
https://www.jetbrains.com/pycharm/webhelp/reformat-code-dialog.html