- 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. Надеюсь что будут еще замечания, такие же конструктивные и полезные.
guest 09.12.2014 00:21 # +10
apgurman 09.12.2014 04:07 # −3
intestinalbrain 09.12.2014 18:21 # +2
apgurman 10.12.2014 00:13 # −1
1024-- 10.12.2014 00:31 # +2
Зачем Вы место, где программисты собираются у костра для разговоров по душам, в мастерскую идеального кода превращаете? Начните уже развлекаться, что Вы серьёзный-то такой!
apgurman 10.12.2014 02:31 # −1
guest 12.12.2014 17:20 # −3
3.14159265 12.12.2014 18:13 # +2
guest 12.12.2014 18:24 # 0
Это я. Как дела, как поживаешь?
bormand 12.12.2014 18:33 # 0
Привет, Стертор. Давно не заходил к нам на огонёк.
guest 12.12.2014 20:04 # +3
ровно через 3 года зарегаю учётку. если не умру и не женюсь.
guest 12.12.2014 23:27 # 0
1024-- 13.12.2014 12:05 # 0
P.S. Заходите к нам почаще. Место около костра с видом на речку всё ещё пустует.
apgurman 13.12.2014 10:28 # 0
apgurman 13.12.2014 10:31 # 0
Vasiliy 10.12.2014 11:38 # 0
это в иной реальности. В именно этой реальности на ГК обсуждается все то, что интересно в данный момент.
Беседы на кухне отличная метафора. Так вот на кухне ни кто не будет тебя учить как надо. Ибо таких дел на работе достаточно. На хера еще своё личное время на это тратить.
bormand 10.12.2014 11:41 # +2
Нахера.
Vasiliy 10.12.2014 11:43 # −1
apgurman 10.12.2014 21:43 # −5
Vasiliy 10.12.2014 21:46 # 0
guest 11.12.2014 08:41 # +6
1,5
guest 12.12.2014 11:31 # 0
bormand 09.12.2014 07:44 # +2
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 подходит?
apgurman 09.12.2014 07:55 # 0
Там все сложнее)) __out_splitter.pipes список pip(ов) и он может эти pipes и не иметь вовсе. Т.е. просто ничего не нужно выводить. А если ничего не нужно выводить, то нафига сложные манипуляции с _result строкой производить? да еще и пытаться это в никуда выводить?
bormand 09.12.2014 07:59 # 0
apgurman 09.12.2014 08:01 # 0
apgurman 09.12.2014 08:04 # 0
Может ему будет удобнее сплиттер в виде пустого списка держать Зачем мне об этом думать? Моя задача перестраховаться в этом месте
bormand 09.12.2014 08:09 # 0
Вот именно. Дёргал бы write в любом случае да и всё. Бутылочным горлышком эти сложения строк не должны стать.
P.S. Или ты погонял код под профайлером и выяснил, что при отправке в пустой OutputSplitter именно эта функция просаживает производительность?
apgurman 09.12.2014 08:14 # 0
apgurman 09.12.2014 08:16 # 0
bormand 09.12.2014 08:27 # 0
Да ну... Ты же эти файлы скорее всего читать будешь, или в субд куда-нибудь вносить, в текстовый файлик писать, в конце-концов... Это же всё явно не ради подсчета файлов пилилось?
Имхо, лучше сделать троттлинг отчета - писать отчет в сплиттер не чаще раза в секунду, к примеру. От этого производительности будет явно больше, чем от проверки на пустой pipes. Да и юзеру приятней будет смотреть.
P.S. Под виндой терминал лагает как говно. Там именно он и будет bottleneck'ом. В линухе чуть лучше, но тоже запросто может упереться именно в него (сейчас затестим).
apgurman 09.12.2014 08:40 # 0
bormand 09.12.2014 09:00 # 0
А про троттлинг, кстати, подумай. С ним вывод намного приятней смотрится - не бесконечно бегущий поток символов, а аккуратный отчетик каждую секунду (можно и реже, я обычно на 5-10 настраиваю). Бесплатная плюшка - форматирование строки раз в секунду вообще не напрягает, и можно забить на self.__out_splitter.pipes и прочие оптимизации.
> Слышал?
Ну.
apgurman 10.12.2014 00:06 # 0
Обычный человек, когда ложится спать, ставит на тумбочку стакан с водой на случай если он захочет пить. Программист ставит стакан с водой на случай если он захочет пить и пустой стакан на случай если он не захочет пить.
Надеюсь ты видишь связь этого "анекдота" c нашей дискуссией про pipes
guest 11.12.2014 08:42 # 0
bormand 11.12.2014 10:00 # 0
guest 11.12.2014 20:43 # 0
bormand 11.12.2014 21:11 # 0
guest 12.12.2014 06:54 # 0
>Но я там не звонки слал, а просто большой файлик случайно высрал в stdout.
Я - то же самое. Комп не вис, но висли **все** консоли.
apgurman 09.12.2014 07:56 # 0
apgurman 09.12.2014 07:57 # 0
Это я у вас учусь
bormand 09.12.2014 08:04 # 0
Форматируешь тоже через жопу: И не экономь пробелы вокруг операторов, нечитабельно же (читай PEP-8, если мне не веришь).
apgurman 09.12.2014 08:08 # −2
bormand 09.12.2014 08:10 # 0
Пожалуйста ;)
guest 09.12.2014 21:51 # 0
wvxvw 09.12.2014 23:36 # 0
guest 11.12.2014 08:43 # 0
Только в срачло!
Анонимус 10.12.2014 01:37 # 0
https://www.jetbrains.com/pycharm/webhelp/reformat-code-dialog.html
guest 11.12.2014 08:44 # 0
kyzi007 11.12.2014 13:20 # +3
guest 11.12.2014 20:42 # +1
Lure Of Chaos 13.12.2014 22:29 # +1