- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
嗯,我正在读这个post然后我遇到了一个代码:
jokes=range(1000000)
domain=[(0,(len(jokes)*2)-i-1) for i in range(0,len(jokes)*2)]
我认为在列表理解之外计算 len(jokes) 的值不是更好吗?
好吧,我试过了,并计时了三个代码
jv@Pioneer:~$ python -m timeit -s 'jokes=range(1000000);domain=[(0,(len(jokes)*2)-i-1) for i in range(0,len(jokes)*2)]'
10000000 loops, best of 3: 0.0352 usec per loop
jv@Pioneer:~$ python -m timeit -s 'jokes=range(1000000);l=len(jokes);domain=[(0,(l*2)-i-1) for i in range(0,l*2)]'
10000000 loops, best of 3: 0.0343 usec per loop
jv@Pioneer:~$ python -m timeit -s 'jokes=range(1000000);l=len(jokes)*2;domain=[(0,l-i-1) for i in range(0,l)]'
10000000 loops, best of 3: 0.0333 usec per loop
观察到第一个和第二个之间 2.55% 的边际差异让我想到 - 是第一个列表理解
domain=[(0,(len(jokes)*2)-i-1) for i in range(0,len(jokes)*2)]
由 python 内部优化?还是 2.55% 是一个足够大的优化(假定 len(jokes)=1000000)?
如果这是 - Python 中的其他隐式/内部优化是什么?
开发人员在 Python 中优化的经验法则是什么
?
Edit1:由于大多数答案都是“不要优化,如果速度慢,稍后再做”,我从 Triptych
和 那里得到了一些提示和链接>Ali A
代表做的事情。我将稍微更改一下问题并请求不要。
我们能否从面临“缓慢”的人那里得到一些经验,问题是什么以及如何纠正?
Edit2:对于那些还没有到这里的人,这是一个interesting read
Edit3: 有问题的 timeit
用法不正确,请参阅 dF 的 答案以了解正确用法以及三个代码的计时。
最佳答案
您没有使用 timeit
正确:-s
(setup) 的参数是最初要执行一次的语句,因此您实际上只是在测试一个空语句。你想做
$ python -m timeit -s "jokes=range(1000000)" "domain=[(0,(len(jokes)*2)-i-1) for i in range(0, len(jokes)*2)]"
10 loops, best of 3: 1.08 sec per loop
$ python -m timeit -s "jokes=range(1000000)" "l=len(jokes);domain=[(0,(l*2)-i-1) for i in range(0, l*2)]"
10 loops, best of 3: 908 msec per loop
$ python -m timeit -s "jokes=range(1000000)" "l=len(jokes*2);domain=[(0,l-i-1) for i in range(0, l)]"
10 loops, best of 3: 813 msec per loop
虽然加速仍然不显着,但更为显着(分别为 16% 和 25%)。因此,由于它不会使代码变得更复杂,因此这种简单的优化可能是值得的。
要解决实际问题...Python 中通常的经验法则是
在编码时,优先使用简单易读的代码而不是优化。
分析您的代码(profile / cProfile
and pstats
是您的 friend )以找出您需要优化的内容(通常是紧循环之类的东西)。
需要注意的一件事:与许多其他语言相比,函数调用在 Python 中相对昂贵,这就是为什么即使 len
为 O(1),您的示例中的优化也有所不同列表。
关于python - Python 中的优化——该做的、不该做的和经验法则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/403794/
我正在为一个类(class)项目制作一个 C# 应用程序。我想确保一个字符串具有三个值之一。通常,在网络应用程序中,我会在客户端使用 javascript 进行验证。但是,这目前是一个控制台应用程序。
我注意到了 int i=10000000; boolean isPrime= false; while(!isPrime){ i++; Syst
一般来说,类构造函数应该接受的最大参数数量是多少?我正在开发一个需要大量初始化数据(目前有 10 个参数)的类。但是,带有 10 个参数的构造函数感觉不对。这让我相信我应该为每条数据创建一个 gett
改善网页加载时间的一种方法是内联其 css - 因为 css 会阻塞渲染。但是,内联 css 会阻止浏览器缓存它。因此,一般建议仅内联“小”css。 但是什么才算“小”呢?我在网上搜索了一些经验法则,
我正在尝试了解如何正确使用 Java 的执行器。我意识到将任务提交给 ExecutorService 有其自身的开销。但是,我很惊讶地看到它竟然这么高。 我的程序需要以尽可能低的延迟处理大量数据(股票
我读过几篇 GWT 开发人员博客,其中提到了一些“经验法则”,即如果生成的 JavaScript 代码达到 100 行或更多,最好自己编写 JavaScript(而不是通过 GWT 生成它) . 我的
最近我偶然发现了一个非常大的性能改进——我说的是 4 倍的改进——只需更改一行代码。我刚刚将 std::sort 调用更改为 concurrency_parallel 排序 // Get a cont
我在 javascript 中使用 setTimeout() 函数来允许在解析一些 xml 数据时显示一个显示“正在加载”的弹出窗口。我发现,在足够小的延迟值(低于 10 毫秒)下,在浏览器卡住一段时
Leonid 在他的书的第四章中写道:“...Module、Block 和 With。这些结构在 Mathematica Book 和 Mathematica Help 中有详细解释,所以我在这里简单
我是一名优秀的程序员,十分优秀!