Python的os.path.join慢吗?
有人告诉我,os.path.join
在Python中非常慢,所以我应该用字符串拼接('%s/%s' % (x, y)
)来代替。真的有那么大的区别吗?如果有的话,我该怎么去检测这个差别呢?
7 个回答
3
另外要注意,在函数调用中使用句点(.)会比较慢。比如说:
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
8
我不知道是谁告诉你不要使用它,但他们错了。
- 就算它慢,也绝对不会慢到影响程序运行的程度。我从来没有觉得它慢过。
- 它对于跨平台编程非常重要。不同的平台有不同的路径分隔符,而
os.path.join
会始终正确地连接路径,无论在哪个平台上。 - 可读性。大家都知道
join
是在做什么。对于路径的字符串拼接,可能需要多看一眼才能明白。
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
并没有算在报告的运行时间里。可以查看 文档。