我制作了以下程序(在您的帮助下),它在文件中打印给定路径包含的文件和文件夹的所有路径:
from os import walk, getcwd
def ls(ruta = getcwd()):
for root, subdirs, archivos in walk(ruta):
f = open("ficheroderutas.txt","a",encoding="utf8")
for archivo in archivos:
f.write(root+'\\'+archivo+"\n")
for subdir in subdirs:
f.write(root+'\\'+subdir+"\n")
f.close()
return
我遇到的问题是,当我输入时:ls(ruta='C:\\')
因为我想将硬盘驱动器上文件和文件夹的所有路径保存在一个文件中,所以我需要几分钟才能完成这项任务(生成一个将近 30MB 的 txt 文件)。我想知道是否有更快的方法来运行此代码或其他任何代码。我不打算更改代码,除非它是利用允许并行化的库的功能,类似于 c 的分支......我想它会存在。因为最后一点很重要,因为我的计算机中有几个内核。好吧,答案可能非常广泛或不那么长。基本上,对我来说听起来的选项是:
- 生成我的程序的 .exe,因为我想如果它是用已经编译的机器代码编写的以将其提供给 micro,它会比通过解释器执行它运行得更快。
- 翻译它 c,最好用 python->c 翻译器(这就是它的名字,对吗?),虽然我认为问题是自动化这种类型的程序重写任务不会导致代码像你自己重写一样高效.
- 使用一些允许我并行化我的代码的 python 库。
有谁知道是否还有其他选择?不知道有没有其他选择。如果并行化库存在,它叫什么?
操作系统:WXP SP3
Python 3.4.4
您的代码最大的问题是您不断打开和关闭文件,简化这已经大大减少了时间(在我的情况下,它从 164 秒减少到 7 秒):
这样您只需打开文件一次。请注意,
with
当函数结束时,使用文件会自动关闭。他return
也是不必要的。如果你想优化某些东西,你必须知道是什么让你慢了下来。考虑并行化或将例程传递给 C++ 就是用炮火杀死苍蝇。来吧,如果你不知道它会为你解决问题,我不建议你在这上面浪费时间。
至少,在程序运行时密切关注 CPU 负载水平。也许最耗时的是硬盘来读取整个磁盘,并且您将无法改进代码,因为这不是处理器本身没有更多的问题。顺便问一下,你的硬盘是SSD吗?
您还必须应用一点“横向思维”例如:程序的目的是什么?监控文件系统变化?在这种情况下,请使用事件监视器。
既然您似乎对这个主题感兴趣,为什么不学习profiling呢?您可以从 cProfile 开始,这非常简单。