Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中高效地处理数字_Python_Python 2.7 - Fatal编程技术网

在python中高效地处理数字

在python中高效地处理数字,python,python-2.7,Python,Python 2.7,我在Python方面遇到了一些问题。 我正在用Python(topcoder,codeforces)解决一些编程任务。有时我需要数一些东西。例如:计算字符串或其他内容中的子字符串。当我按如下方式计算时: counter += 1 我的解决方案在一些测试中失败了。我对此进行了调查,发现我的代码应该在200000左右。我知道python中的数字是对象。我的代码试图创建200000个对象,因此超出了测试时间限制。在一个任务中,我能够优化算法,最终它需要完全低的加法。但在另一个例子中,这是不可能的,我

我在Python方面遇到了一些问题。 我正在用Python(topcoder,codeforces)解决一些编程任务。有时我需要数一些东西。例如:计算字符串或其他内容中的子字符串。当我按如下方式计算时:

counter += 1
我的解决方案在一些测试中失败了。我对此进行了调查,发现我的代码应该在200000左右。我知道python中的数字是对象。我的代码试图创建200000个对象,因此超出了测试时间限制。在一个任务中,我能够优化算法,最终它需要完全低的加法。但在另一个例子中,这是不可能的,我的代码失败了,因为它应该创建许多数字对象。 我的主要语言是C#,所以我想知道,我应该如何高效地使用Python数字

我在那个里找不到任何类似的问题,所以我在问这个问题

$ python -m timeit 'counter = 0
> for _ in xrange(200000): counter += 1'
100 loops, best of 3: 9.25 msec per loop
小于10毫秒是否会对你的测试产生如此大的影响?我不这么认为

很可能
计数器+=1
指令不是瓶颈。您可能使用了错误的算法,或者以错误的方式实现了该算法


在时使用

$ python -m timeit 'counter = 0
> while counter < 200000: counter += 1'
100 loops, best of 3: 10.5 msec per loop
$python-m timeit'计数器=0
>计数器<200000时:计数器+=1'
100个循环,最好为3:10.5毫秒/循环

您的代码失败的任务是什么?我建议不是因为您使用Python编写代码,这意味着您正在超时,而是因为您的算法的复杂度太低,这意味着您正在超时(例如,问题需要一个O(nlogn)复杂度解决方案,并将超时设置为没有O(n^2)即使在Python中,任何一个O(nLogn)都可以在C++中实现。我应该在字符串中计算子串。如果需要计数200000,那么你就错了。你能提供问题链接吗?计数器+=1是原子的,需要恒定的时间,并且不会改变算法的复杂性。topcoder/codeforces中的问题更多的是算法密集型而不是语言密集型。也许你需要想出一个更好的算法。使用生成器函数(
xrange
)是展示这种计时的一种不好的方式。您应该使用裸while循环测试(计数器<20000)。生成器至少会产生堆栈帧开销。@PreetKukreti那又怎样?如果他们有开销,那么这就意味着
9.25毫秒
是一个松散的“过度计时”,这更说明了我的观点:问题不在于计数器,也不在于循环。顺便说一下:在python中,
循环比
循环慢(参见更新的答案)。@Bariku很好,它实际上强调了你的论点。而且我发现我的建议实际上比xrange慢。看来我错了。另一个经验教训是:首先是简介,然后是担忧:)+1尽管如上所述,我对其中一些编程挑战/测试套件很熟悉,其中一些套件的复杂性检查(例如)实际上具有10ms级别的粒度。我认为他们测试这些是多次运行的平均值。这可能是一个转折点,但我怀疑如果没有一些算法错误的话,它会是一个转折点。