Python的os.path.join慢吗?

3 投票
7 回答
3164 浏览
提问于 2025-04-16 09:48

有人告诉我,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

我不知道是谁告诉你不要使用它,但他们错了。

  1. 就算它慢,也绝对不会慢到影响程序运行的程度。我从来没有觉得它慢过。
  2. 它对于跨平台编程非常重要。不同的平台有不同的路径分隔符,而os.path.join会始终正确地连接路径,无论在哪个平台上。
  3. 可读性。大家都知道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 并没有算在报告的运行时间里。可以查看 文档

撰写回答