Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 11, 2014 11:08:28

Nata
От:
Зарегистрирован: 2010-10-02
Сообщения: 87
Репутация: +  6  -
Профиль   Отправить e-mail  

Регулярное выражение, вернуть последнее совпадение.

>>> reg1 = re.compile(r'[^/]*$')
>>> reg2 = re.compile(r'.*/(.+)')
>>>
>>> class my_string(str):
...     def slash_split(self):
...             return self.split("/")
... 
>>> path=my_string('/home/test/soft/print.sh')
>>>
>>> commands={"split":my_string.slash_split, "os.path.basename":os.path.basename, "reg1":reg1.search, "reg2":reg2.search}
>>>
>>> for cmd in commands:
	command = commands[cmd]
...     start_time = time.time()
...     for i in range(1000000):
...             f=command(path)
...     print("%s took %f seconds" % (cmd, time.time() - start_time))
... 
os.path.basename took 0.624602 seconds
reg2 took 0.748091 seconds
split took 0.858206 seconds
reg1 took 2.544495 seconds
>>>

os.path.basename всех победил! :D :D



Отредактировано Nata (Окт. 11, 2014 11:09:35)

Офлайн

#2 Окт. 11, 2014 11:19:39

Nata
От:
Зарегистрирован: 2010-10-02
Сообщения: 87
Репутация: +  6  -
Профиль   Отправить e-mail  

Регулярное выражение, вернуть последнее совпадение.

ой, нет, извиняюсь, в чистом виде split быстрее basename

start_time = time.time()
for i in range(1000000):
        f='/home/test/soft/print.sh'.split('/')[-1]
print("split took %f seconds" % (time.time()-start_time))
start_time = time.time()
for i in range(1000000):
        f=os.path.basename('/home/test/soft/print.sh')
print("basename took %f seconds" % (time.time()-start_time))

nata@mycomp:~$ ./check.py
split took 0.652838 seconds
basename took 0.716145 seconds

split всех победил! :D :D



Отредактировано Nata (Окт. 11, 2014 11:22:40)

Офлайн

#3 Окт. 11, 2014 12:15:14

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Регулярное выражение, вернуть последнее совпадение.

А почему не rsplit('/', 1) ?

Офлайн

#4 Окт. 11, 2014 17:51:35

bs0d
Зарегистрирован: 2014-02-01
Сообщения: 76
Репутация: +  2  -
Профиль   Отправить e-mail  

Регулярное выражение, вернуть последнее совпадение.

Nata
<— плюс там

Офлайн

#5 Окт. 11, 2014 20:05:42

Nata
От:
Зарегистрирован: 2010-10-02
Сообщения: 87
Репутация: +  6  -
Профиль   Отправить e-mail  

Регулярное выражение, вернуть последнее совпадение.

dimy44
А почему не rsplit('/', 1) ?
добавила rsplit
f='/home/test/soft/print.sh'.rsplit('/')[-1]
nata@mycomp:~$ ./check.py
split took 0.674300 seconds
rsplit took 0.777677 seconds
basename took 0.708357 seconds

:D



Отредактировано Nata (Окт. 11, 2014 20:10:14)

Офлайн

#6 Окт. 11, 2014 21:35:25

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Регулярное выражение, вернуть последнее совпадение.

Я имел в виду, что в rsplit нужно передать количество разбиений вторым параметром, в данном случае 1

Офлайн

#7 Окт. 11, 2014 21:49:34

Nata
От:
Зарегистрирован: 2010-10-02
Сообщения: 87
Репутация: +  6  -
Профиль   Отправить e-mail  

Регулярное выражение, вернуть последнее совпадение.


так?

f='/home/test/soft/print.sh'.rsplit('/', 1)[-1]
nata@mycomp:~$ ./check.py
split took 0.670396 seconds
rsplit took 0.606263 seconds
basename took 0.706765 seconds

не знала про этот параметр, спасибо :)



Офлайн

#8 Окт. 11, 2014 23:03:28

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

Регулярное выражение, вернуть последнее совпадение.

Это всё хорошо, но врядли эти сотые доли имеют значение, все же с путями работает os.path, да и по большому счету разделитель не везде ‘/’, лучше юзать константу os.sep. И еще, если уж получается такая циклодробилка, то желательно перед циклом записать например os_path_basename = os.path.basename - сохранить в локальную переменную и юзать ее в цикле, ее поиск в пространстве имен будет производиться быстрее.

Офлайн

#9 Окт. 11, 2014 23:30:12

Nata
От:
Зарегистрирован: 2010-10-02
Сообщения: 87
Репутация: +  6  -
Профиль   Отправить e-mail  

Регулярное выражение, вернуть последнее совпадение.

dimy44
Это всё хорошо, но врядли эти сотые доли имеют значение
мы просто выбирали чемпиона по скорости нахождения имени файла в path :D
мы не будем так писать в реальной жизни, ну если только нужда не заставит…
dimy44
os_path_basename = os.path.basename - сохранить в локальную переменную и юзать ее в цикле
dimy44
лучше юзать константу os.sep
100% agreed



Офлайн

#10 Окт. 11, 2014 23:33:49

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10014
Репутация: +  857  -
Профиль   Отправить e-mail  

Регулярное выражение, вернуть последнее совпадение.

[guest@localhost ~]$ python3 -mtimeit "import re; r = re.compile(r'.*/(.+)'); r.search('/home/test/soft/print.sh').group(1)"
100000 loops, best of 3: 3.79 usec per loop
[guest@localhost ~]$
[guest@localhost ~]$ python3 -mtimeit "import re; re.search(r'[^/]*$', '/home/test/soft/print.sh').group()"
100000 loops, best of 3: 5.05 usec per loop
[guest@localhost ~]$
[guest@localhost ~]$ python3 -mtimeit "import os; os.path.basename('/home/test/soft/print.sh')"
100000 loops, best of 3: 3.23 usec per loop
[guest@localhost ~]$

[guest@localhost ~]$ python3 -mtimeit "'/home/test/soft/print.sh'.rsplit('/', 1)[-1]"
1000000 loops, best of 3: 0.707 usec per loop
[guest@localhost ~]$
[guest@localhost ~]$ python3 -mtimeit "'/home/test/soft/print.sh'.split('/')[-1]"
1000000 loops, best of 3: 0.755 usec per loop
[guest@localhost ~]$

Ну вот, мой получился самым медленным. А правильный .rsplit() - самым быстрым.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version