更好/更快的Python代码

时间:2015-08-20 10:24:05

标签: python performance

这里还有另一个noob查询。像“从不写两次相同的代码”这样的行情让我试图找出我的错误;这是我想改进的一个: 主文件中的代码:

if os.name == 'nt':
    dosomething
另一种方式:

if os.name == 'nt':
    os_is_nt = True

if os_is_nt:
    dosomething

另一种方法,将此函数放入导入

detectNT()
    if os.name == 'nt':
        return True
    else:
        return False

我的信念是,如果不弄清楚如何检查任何速度差异,我应该将它切回原来:

if os.name == 'nt':
    dosomething

但我的信仰很弱,这就是为什么我在这里。

另外,我在想有一种方法可以找到本地文件分隔符..? 我写了这个:

def os_file_sep():
    file_separator = "/"
    if os.name == 'nt':
        file_separator = "\\"
    return file_separator

2 个答案:

答案 0 :(得分:1)

你应该用什么?

使用import Control.Applicative (liftA2) liftA2 g getLine getLine >>= putStrLn (或os.path.join)。不要重新发明轮子。它简单而且很棒。

os.path.sep

如果没有这种(更好)的方式怎么办?

  • 价值永远不会改变 - 第一种方式(“直接”>>>os.path.join("foo", "bar") 'foo\\bar' 检查)是最好的IMO。它简单易读(除非你在许多不同的地方检查,然后我猜变量可能更容易出错)。
  • 值更改 - 我会选择变量,if检查检查是否简单,如果检查复杂,则会起作用。

答案 1 :(得分:1)

你的一般性问题是关于表现,所以我会回答这个问题。

主要规则是:除非您确实需要,否则不要担心低级别的表现。这意味着你应该小心算法而不是初看到低级优化,并且总是喜欢简单和可维护的代码。

当您遇到性能问题(或怀疑您很快就会遇到)时,请查看您的代码。 Python提供了标准库中开箱即用的有用工具。其中一个是profile或其优化版本cProfile。摘自手册:

要使用主入口点foo()来分析应用程序,您需要将以下内容添加到模块中:

import cProfile
cProfile.run('foo()')

上述操作会导致foo()运行,并会打印一系列信息行(个人资料)。

现在您知道您的计划大部分时间花在哪里,并且您知道应该进行低级优化的部分。

再次,Python提供了timeit模块的开箱即用。 该模块提供了一种简单的方法来计算一小段Python代码。它既有命令行,也有可调用的接口。它避免了许多用于测量执行时间的常见陷阱

对于您提出的确切问题,正确的答案是DavidMašek的答案。这是针对性能的一般问题。无论如何,如果您对不同解决方案(您和David的解决方案)的表现有疑问,请使用timeit来确定,并可选择在此自我回答。