📜  竞争性编程中的Python

📅  最后修改于: 2021-06-25 23:07:57             🧑  作者: Mango

2017年,当ACM允许Python支持其著名的竞赛ACM ICPC时,一个全新的社区对竞争性编程运动产生了兴趣。这意味着更多的人回到基础知识,学习算法,这些算法是他们用来构建高级软件包的复杂软件包的构建块。
不幸的是,关于如何有效使用数据结构甚至Python的作用域规则的信息不多,人们因此认为Python对于竞争性编程而言是次要的。
今天,我将向您展示Python有时由于其惊人的库而比C++或Java更强大的功能,以及它实际上有多简单。

让我通过一个简单的示例进行演示,看看下面的代码片段:

alphabets = ['a', 'b', 'c']
for item in alphabets:
    len(item) 
alphabets = ['a', 'b', 'c']
fn = len
for item in alphabets:
        fn(item)

您可能会认为我已经为函数“ len”分配了别名,但可能没有什么不同。
因此,我编写了如下的性能测试函数。

import datetime
alphabets = [str(x)for x in range(10000000)]
a = datetime.datetime.now() # store initial time
for item in alphabets:
    len(item)
b = datetime.datetime.now() # store final time
print (b-a).total_seconds() # results
a = datetime.datetime.now()
fn = len                    # function stored locally
for item in alphabets:
    fn(item)
b = datetime.datetime.now()
print (b-a).total_seconds()

我鼓励您在系统上尝试。
这是我运行Performance.py脚本时的输出。

接近一半!

好的,现在让我们尝试分析发生这种情况的原因。原因?查找函数是一项昂贵的操作。
在第二个片段,我直接存储函数的函数的范围,所以没关系我多少次调用它,每次运行时确切地知道它必须寻找结果的时间。

Itertools
如果您曾经使用过代码部队,那么现在您已经知道很多编程挑战都涉及回溯。因此,今天我将向您介绍一个使用内置库程序包来生成所有排列和组合的库,该程序包非常快。 Itertools。如果您想使用Python解决算法难题,那么itertools是一个库,您一定要探索。
生成所有排列–

from itertools import permutations
perm = permutations([1, 2, 3], 2)
for i in list(perm):
    print i
  
# Answer->(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)

Combines()函数的行为类似,我鼓励读者自己尝试一下。