我被告知os.path.join
在python中速度非常慢,我应该使用字符串连接('%s/%s' % (x, y)
)代替。是否真的存在很大差异?如果是这样,我该如何跟踪它?
答案 0 :(得分:12)
$ python -mtimeit -s 'import os.path' 'os.path.join("/root", "file")'
1000000 loops, best of 3: 1.02 usec per loop
$ python -mtimeit '"/root" + "file"'
10000000 loops, best of 3: 0.0223 usec per loop
所以是的,它慢了近50倍。虽然1微秒仍然没有没有,所以我真的不会考虑差异。使用os.path.join
:它是跨平台的,更具可读性且不易出错。
编辑:现在有两个人评论说import
解释了差异。事实并非如此,因为-s
是一个设置标志,因此import
未计入报告的运行时。阅读the docs。
答案 1 :(得分:8)
我不知道是谁告诉你不要使用它,但是他们错了。
os.path.join
将始终正确连接路径,无论平台如何。join
正在做什么。人们可能不得不对路径的字符串连接进行双重处理。答案 2 :(得分:2)
还要注意,函数调用中的句点已知很慢。比较:
python -mtimeit -s "import os.path;x=range(10)" "os.path.join(x)"
1000000 loops, best of 3: 0.405 usec per loop
python -mtimeit -s "from os.path import join;x=range(10)" "join(x)"
1000000 loops, best of 3: 0.29 usec per loop
只需在函数调用语法中使用句点,就可以减缓40%。
奇怪的是,这两种速度不同:
$ python -mtimeit -s "from os.path import sep;join=sep.join;x=map(str,range(10))" "join(x)"
1000000 loops, best of 3: 0.253 usec per loop
$ python -mtimeit -s "from os.path import join;x=map(str,range(10))" "join(x)"
1000000 loops, best of 3: 0.285 usec per loop
答案 3 :(得分:1)
它可能快近50倍,但除非你在CPU内部紧密的内环中进行,否则速度差异根本不重要。另一方面,可移植性差异将决定您的程序是否可以轻松移植到非Unix平台。
所以,请使用os.path.join
,除非您已经分析并发现它确实是您计划表现的主要障碍。
答案 4 :(得分:1)
您应该仅使用os.path.join
来实现可移植性。
我不认为os.path.join
(适用于任何平台上的任何数字或部分)与字符串格式化两条路径一样简单。
要回答标题中的问题,“ Python的os.path.join慢吗?”你必须至少将它与远程类似的函数进行比较,以找出你可以期望的速度像这样的功能。
如下所示,与类似功能相比, os.path.join
没有任何进展:
python -mtimeit -s "x = tuple(map(str, range(10)))" "'/'.join(x)"
1000000 loops, best of 3: 0.26 usec per loop
python -mtimeit -s "from os.path import join;x = tuple(range(10))" "join(x)"
1000000 loops, best of 3: 0.27 usec per loop
python -mtimeit -s "x = tuple(range(3))" "('/%s'*len(x)) % x"
1000000 loops, best of 3: 0.456 usec per loop
python -mtimeit -s "x = tuple(map(str, range(3)))" "'/'.join(x)"
10000000 loops, best of 3: 0.178 usec per loop
答案 5 :(得分:0)
在这场激烈的争论中,我敢于提议:
(我知道,我知道,有时间,但我没有接受过timeit训练,而且我觉得时钟()对于这个案子来说已经足够了)
import os
from time import clock
separ = os.sep
ospath = os.path
ospathjoin = os.path.join
A,B,C,D,E,F,G,H = [],[],[],[],[],[],[],[]
n = 1000
for essays in xrange(100):
te = clock()
for i in xrange(n):
xa = os.path.join('C:\WINNT\system32','Microsoft\Crypto','RSA\MachineKeys')
A.append(clock()-te)
te = clock()
for i in xrange(n):
xb = ospath.join('C:\WINNT\system32','Microsoft\Crypto','RSA\MachineKeys')
B.append(clock()-te)
te = clock()
for i in xrange(n):
xc = ospathjoin('C:\WINNT\system32','Microsoft\Crypto','RSA\MachineKeys')
C.append(clock()-te)
te = clock()
for i in xrange(n):
xd = 'C:\WINNT\system32'+os.sep+'Microsoft\Crypto'+os.sep+'RSA\MachineKeys'
D.append(clock()-te)
te = clock()
for i in xrange(n):
xe = '%s\\%s\\%s' % ('C:\WINNT\system32','Microsoft\Crypto','RSA\MachineKeys')
E.append(clock()-te)
te = clock()
for i in xrange(n):
xf = 'C:\WINNT\system32'+separ+'Microsoft\Crypto'+separ+'RSA\MachineKeys'
F.append(clock()-te)
te = clock()
for i in xrange(n):
xg = os.sep.join(('C:\WINNT\system32','Microsoft\Crypto','RSA\MachineKeys'))
G.append(clock()-te)
te = clock()
for i in xrange(n):
xh = separ.join(('C:\WINNT\system32','Microsoft\Crypto','RSA\MachineKeys'))
H.append(clock()-te)
print min(A), "os.path.join('C:\WINNT\system32','Microsoft\Crypto','RSA\MachineKeys')"
print min(B), "ospath.join('C:\WINNT\system32','Microsoft\Crypto','RSA\MachineKeys')"
print min(C), "ospathjoin('C:\WINNT\system32','Microsoft\Crypto','RSA\MachineKeys')"
print min(D), "'C:\WINNT\system32'+os.sep+'Microsoft\Crypto'+os.sep+'RSA\MachineKeys'"
print min(E), "'%s\\%s\\%s' % ('C:\WINNT\system32','Microsoft\Crypto','RSA\MachineKeys')"
print min(F), "'C:\WINNT\system32'+separ+'Microsoft\Crypto'+separ+'RSA\MachineKeys'"
print min(G), "os.sep.join('C:\WINNT\system32','Microsoft\Crypto','RSA\MachineKeys')"
print min(H), "separ.join('C:\WINNT\system32','Microsoft\Crypto','RSA\MachineKeys')"
print 'xa==xb==xc==xd==xe==xf==xg==xh==',xa==xb==xc==xd==xe==xf==xg==xh
结果
0.0284533369465 os.path.join('C:\ WINNT \ system32','Microsoft \ Crypto','RSA \ MachineKeys')
0.0277652606686 ospath.join('C:\ WINNT \ system32','Microsoft \ Crypto','RSA \ MachineKeys')
0.0272489939364 ospathjoin('C:\ WINNT \ system32','Microsoft \ Crypto','RSA \ MachineKeys')
0.00398598145854'C:\ WINNT \ system32'+ os.sep +'Microsoft \ Crypto'+ os.sep +'RSA \ MachineKeys'
0.00375075603184'%s \%s \%s'%('C:\ WINNT \ system32','Microsoft \ Crypto','RSA \ MachineKeys')
0.00330824168994'C:\ WINNT \ system32'+ separ +'Microsoft \ Crypto'+ separ +'RSA \ MachineKeys'
0.00292467338726 os.sep.join('C:\ WINNT \ system32','Microsoft \ Crypto','RSA \ MachineKeys')
0.00261401937956 separ.join('C:\ WINNT \ system32','Microsoft \ Crypto','RSA \ MachineKeys')
真
带
separ = os.sep
ospath = os.path
ospathjoin = os.path.join
答案 6 :(得分:-3)
每个人都应该知道os.path.join()
的一个不可思议的特性os.path.join( 'a', 'b' ) == 'a/b'
os.path.join( 'a', '/b' ) == '/b'