Форум сайта python.su
6
>>> 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 >>>
Отредактировано Nata (Окт. 11, 2014 11:09:35)
Офлайн
6
ой, нет, извиняюсь, в чистом виде 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
Отредактировано Nata (Окт. 11, 2014 11:22:40)
Офлайн
А почему не rsplit('/', 1) ?
Офлайн
2
Nata
<— плюс там
Офлайн
6
dimy44добавила rsplit
А почему не rsplit('/', 1) ?
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
Отредактировано Nata (Окт. 11, 2014 20:10:14)
Офлайн
Я имел в виду, что в rsplit нужно передать количество разбиений вторым параметром, в данном случае 1
Офлайн
6
так?
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
Офлайн
Это всё хорошо, но врядли эти сотые доли имеют значение, все же с путями работает os.path, да и по большому счету разделитель не везде ‘/’, лучше юзать константу os.sep. И еще, если уж получается такая циклодробилка, то желательно перед циклом записать например os_path_basename = os.path.basename - сохранить в локальную переменную и юзать ее в цикле, ее поиск в пространстве имен будет производиться быстрее.
Офлайн
6
dimy44мы просто выбирали чемпиона по скорости нахождения имени файла в path :D
Это всё хорошо, но врядли эти сотые доли имеют значение
dimy44
os_path_basename = os.path.basename - сохранить в локальную переменную и юзать ее в цикле
dimy44100% agreed
лучше юзать константу os.sep
Офлайн
857
[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 ~]$Офлайн