【发布时间】:2013-02-23 13:26:16
【问题描述】:
请查看以下代码来解决同一组问题,我认为提及问题无论如何都不会帮助达到目的,这是Josephus problem的又一次迭代:
解决方案 1:
import sys
from math import log
cases= int(sys.stdin.readline())
current= 0
while current < cases:
current += 1
n = int(sys.stdin.readline())
print 2*(n - 2**(int(log(n,2))))+1
此方案在累计 1.0912 秒内解决给定的 10 个测试用例,并消耗 4360KiB 的内存。
解决方案 2:
def josephus_2( n ):
from math import log
return 2*(n - 2**(int(log(n,2))))+1
import sys
cases= int(sys.stdin.readline())
current= 0
while current < cases:
current += 1
n = int(sys.stdin.readline())
print josephus_2( n )
此解决方案在总共 1.0497 秒和 640KiB 内存中解决了相同的 10 个测试用例。
作为一名 Python n00b 我想知道,虽然根据在线评委的说法,我在这两个方面都获得了相同的分数,但是是什么让解决方案 2 比 1 更快并且内存效率更高?我知道时差听起来可能非常小,但同时在最快的解决方案上我排名第一,甚至比 c/c++/perl 提交的速度还快
【问题讨论】:
-
有什么方法可以自己测试吗?第一种方法对我来说要快得多。
-
如果将复杂的函数分离成自己的方法,这可能与 JITing 更容易有关。只是猜测
-
您有示例输入文件吗?
-
你试过用dis反编译吗?
-
检查此stackoverflow.com/questions/11241523/… 生成的字节码因变量范围而异,即本地与全局
标签: python performance python-2.7 time josephus