[英]Is Python's os.path.join slow?
我被告知os.path.join
在python中非常慢,我應該使用字符串連接( '%s/%s' % (x, y)
)代替。 是否真的存在很大差異?如果是這樣,我該如何跟蹤它?
$ 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
不會計入報告的運行時。 閱讀文檔 。
我不知道是誰告訴你不要使用它,但他們錯了。
os.path.join
將始終正確地連接路徑,而不管平台如何。 join
正在做什么。 人們可能不得不為路徑的字符串連接做雙重操作。 還要注意,函數調用中的句點已知很慢。 相比:
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
它可能快近50倍,但除非你在CPU內部緊密的內環中進行,否則速度差異根本不重要。 另一方面,可移植性差異將決定您的程序是否可以輕松移植到非Unix平台。
因此,請使用os.path.join
除非您已經分析並發現它確實是您程序性能的主要障礙。
您應該使用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
在這場炙手可熱的爭議中,我敢於提出:
(我知道,我知道,有時間,但我沒有接受過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
每個人都知道os.path.join()的一個不可思議的特性
os.path.join( 'a', 'b' ) == 'a/b'
os.path.join( 'a', '/b' ) == '/b'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.