`
edison0951
  • 浏览: 71934 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

避免劣化的python代码

阅读更多

劣化代码:

s = []
for i in seq:
  s.append(foo(i))

 

推荐代码:

s = map(foo, seq)
更高效的代码
for i in itertools.imap(foo, seq):
  bar(i)

 劣化代码:

for i in xrange(len(seq1)):
  foo(seq1[i], seq2[i])

 推荐代码:

for i, j in zip(seq1, seq2)
  foo(i, j)
更高效:
for i, j in itertools.izip(seq1, seq2): 
  foo(i, j)

 劣化代码:

for i in xrange(len(seq)):
  foo(seq[i], i)

 推荐代码:

for i, item in enumerate(seq):
  foo(item, i)
 

 劣化代码:

s = seq[:]
s.reverse()
for i in s:
  foo(i)

推荐代码:

for i in reversed(s):
  foo(i)

 劣化代码:

def foo(seq, bgn, end): 
  i=0
  while(bgn < end): bar(seq[bgn], i )
    bgn += 1
    i += 1 
def foo(seq, bgn, end):
   tmp_seq = seq[bgn:end] 
   for i, item in enumerate(tmp_seq):
     bar(item, i)

 推荐代码:

def foo(seq, bgn, end):
  for begin, i in itertools.izip(xrange(bgn, end), itertools.counter()):
    bar(seq[begin], i)

  劣化代码:

for i in seq:
  if pred(i): 
    foo(i)

 推荐代码:

for i in itertools.ifilter(pred, seq):
  foo(i)

如果你又更好的方案,请继续补吧。

分享到:
评论
21 楼 tterry 2011-03-28  
没看出来怎么个劣法,莫非你说劣就劣?
20 楼 marlonyao 2011-01-19  
举的不过是函数式编程的例子罢了,缺少对匿名函数的支持,python的函数式支持比ruby差远了。
19 楼 wizardyhnr 2010-12-15  
盖茨他爹 写道
edison0951 写道
盖茨他爹 写道
第一个用列表解析更高效

另,如果想少敲字,itertools.izip,itertools.imap,itertools.ifilter换成zip、map、filter能少敲很多,迭代器又不比列表高效多少

没有吧,迭代器的好处是不一下全取出来,而是在你需要的时候才去取。列表不可同日而语


import itertools
import time

l = range(1000000)

def test1():
    time1 = time.clock()
    l2 = [str(i) for i in l]
    time2 = time.clock()
    print time2-time1
    
def test2():
    time1 = time.clock()
    l2 = map(str, l)
    time2 = time.clock()
    print time2-time1
    
def test3():
    time1 = time.clock()
    for i in itertools.imap(str, l):
        pass
    time2 = time.clock()
    print time2-time1

test1()
test2()
test3()

测试结果:
1.38556706794
0.642326404896
1.74044392476


map最快,列表解析次之,itertools.imap最慢


迭代器的好处貌似是内存占用小,因为是一个一个执行输出的,而不是一下输出一个完整的列表。文档中还是比较提倡这种写法的。
楼主的写法也可以算作FP编程风格的优点。

函数映射,类似于多态
lst=['a', 'b', 'c']
func={1:prt1, 2:prt2}

def prt1(l):
    [print(t) for t in l]
#这种写法在这不一定合适,只是与map是等效的,语法上更简洁一些。

def prt2(l):
    [print(ord(t)) for t in l]

def prt(l, para):
    func[para](l)

prt(lst, 1)
prt(lst, 2)
18 楼 aninfeel 2010-12-11  
java程序员飘过,一直使用大众看得懂的所谓“劣化代码”中,而且以后还会继续用。
17 楼 盖茨他爹 2010-12-08  
edison0951 写道
盖茨他爹 写道
第一个用列表解析更高效

另,如果想少敲字,itertools.izip,itertools.imap,itertools.ifilter换成zip、map、filter能少敲很多,迭代器又不比列表高效多少

没有吧,迭代器的好处是不一下全取出来,而是在你需要的时候才去取。列表不可同日而语


import itertools
import time

l = range(1000000)

def test1():
    time1 = time.clock()
    l2 = [str(i) for i in l]
    time2 = time.clock()
    print time2-time1
    
def test2():
    time1 = time.clock()
    l2 = map(str, l)
    time2 = time.clock()
    print time2-time1
    
def test3():
    time1 = time.clock()
    for i in itertools.imap(str, l):
        pass
    time2 = time.clock()
    print time2-time1

test1()
test2()
test3()

测试结果:
1.38556706794
0.642326404896
1.74044392476


map最快,列表解析次之,itertools.imap最慢
16 楼 edison0951 2010-12-08  
盖茨他爹 写道
第一个用列表解析更高效

另,如果想少敲字,itertools.izip,itertools.imap,itertools.ifilter换成zip、map、filter能少敲很多,迭代器又不比列表高效多少

没有吧,迭代器的好处是不一下全取出来,而是在你需要的时候才去取。列表不可同日而语
15 楼 伊落丹 2010-12-06  
duka 写道
劣:
found = False
for i in foo:
    if i == 0:
        found = True
        break
if not found: 
    print("i was never 0")


优:
for i in foo:
    if i == 0:
        break
else:
    print("i was never 0")


可能found标志位在后续代码还用得上。

路过,我主业是用C或C++,只是觉得python不用编译比较方便,比C总是更简洁的。所以我既不想学另一套思维方式(怕走火入魔~~),又想利用python的便利。一直在使用劣化python中……
14 楼 duka 2010-12-04  
>>> names = ['Bob', 'Marie', 'Alice']
>>> ages = [23, 27, 36]
>>> dict(zip(names, ages))
{'Alice': 36, 'Bob': 23, 'Marie': 27}
13 楼 duka 2010-12-04  
排序的小技巧:
a = [(2, "b"), (1, "a"), (2, "a"), (3, "c")]
print sorted(a)
#[(1, 'a'), (2, 'a'), (2, 'b'), (3, 'c')]

a = [{2:"b"},{1:"a"}, {2:"a"}]
print sorted(a)
[{1: 'a'}, {2: 'a'}, {2: 'b'}]
12 楼 duka 2010-12-04  
小伎俩:
>>> str(round(1234.5678, -2))
'1200.0'
>>> str(round(1234.5678, 2))
'1234.57'


>>> dict(foo=1, bar=2)
{'foo': 1, 'bar': 2}
11 楼 duka 2010-12-04  
超级技巧,可用于列表对比:
>>> a = set([1,2,3,4])
>>> b = set([3,4,5,6])
>>> a | b # Union
{1, 2, 3, 4, 5, 6}
>>> a & b # Intersection
{3, 4}
>>> a < b # Subset
False
>>> a - b # Difference
{1, 2}
>>> a ^ b # Symmetric Difference
{1, 2, 5, 6}
10 楼 duka 2010-12-04  
劣:
found = False
for i in foo:
    if i == 0:
        found = True
        break
if not found: 
    print("i was never 0")


优:
for i in foo:
    if i == 0:
        break
else:
    print("i was never 0")
9 楼 duka 2010-12-04  
劣化代码:
>>> a = ['a','b','c']
>>> for x in a:
...     print a.index(x),x
...
0 a
1 b
2 c
>>>



推荐代码:
>>> a = ['a', 'b', 'c']
>>> for index, item in enumerate(a): print index, item
...
0 a
1 b
2 c
>>>
8 楼 yeaha 2010-12-04  
没明白到底好在哪里,就是好在python口音比较地道?
我只懂得丁点python,期待解惑
7 楼 kjj 2010-12-03  
正在学python ,收藏一下,以后尽量先用官方库写
6 楼 盖茨他爹 2010-12-03  
第一个用列表解析更高效

另,如果想少敲字,itertools.izip,itertools.imap,itertools.ifilter换成zip、map、filter能少敲很多,迭代器又不比列表高效多少
5 楼 魔力猫咪 2010-12-03  
动态语言之所以效率高,很大程度上就是因为有很多节约敲字的语法糖。合适的语法糖可以大大提高效率和代码可读性。
4 楼 盖茨他爹 2010-12-03  
从另一个角度看,推荐代码好多语法糖
3 楼 edison0951 2010-12-03  
魔力猫咪 写道
我觉得出现这种所谓的劣化代码,很大程度上是对Python的函数库和类库的不熟悉,还有就是自己以前其他语言的思考方式的影响。


对呀,判断一个pythoner的程度,就看这些实例,以及对很多函数库的理解
2 楼 魔力猫咪 2010-12-03  
我觉得出现这种所谓的劣化代码,很大程度上是对Python的函数库和类库的不熟悉,还有就是自己以前其他语言的思考方式的影响。

相关推荐

    多目标遗传优化算法NSGAII求解微电网调度(Python&amp;Matlab)

    通过NSGA-II解决微电网调度问题,可以同时考虑这些目标,寻求一组非劣解,即帕累托最优解。 **NSGA-II算法基础** 1. **种群初始化**:随机生成初始种群,每个个体代表一种可能的解决方案。 2. **编码与解码**:个体...

    基于python的多目标粒子群算法设计与实现

    多目标粒子群优化(Multi-Objective Particle Swarm Optimization, MOPSO)是一种高效的全局优化算法,它能够同时处理多个优化目标,寻找一组非劣解,即帕累托最优解。本篇文章将深入探讨如何使用Python语言实现这一...

    结合熵权法的topsis方法的代码.zip

    这些代码可能包括数据预处理、标准化、熵权计算、距离计算和排序等功能模块。通过阅读和理解这些代码,可以更好地掌握如何在实际问题中应用结合熵权法的Topsis方法进行决策分析。对于学习和实践多准则决策分析的人员...

    变领域搜索算法python版本.rar

    要深入了解这个Python实现,你可以通过阅读源代码,理解各个组件的职责和相互作用,以及如何调整参数以适应特定的优化问题。同时,你也可以根据实际需求对现有代码进行修改或扩展,以实现更高效或适应性更强的VNS...

    群体智能优化算法(python)代码

    4. **模拟退火(SA, Simulated Annealing)**:灵感来源于金属冷却过程,允许在一定概率下接受较劣解以避免过早陷入局部最优。Python实现SA需设定初始温度、降温策略、接受准则等。 5. **深度学习与强化学习在群体...

    多目标优化NSGA3代码_nsga3_多目标优化_matlab_遗传算法

    NSGA3作为遗传算法的一个变种,通过非支配排序、拥挤距离等策略,能够有效地搜索多目标问题的帕累托前沿,提供一系列非劣解供决策者选择。 **NSGA3算法的核心概念**包括: 1. **非支配排序**:这是NSGA系列算法的...

    旅行商问题&java源码&python源码.zip

    2. 模拟退火算法:通过模拟物质冷却过程,允许在一定概率下接受较劣解,以跳出局部最优,寻找全局最优。 3. 遗传算法:通过模拟自然选择和遗传机制,生成一系列解决方案并逐步优化。 4. 动态规划:将问题分解为子...

    MOEAD-master_多目标分解算法_

    通过协同解决这些子问题,可以得到一组非劣解,即所谓的帕累托前沿(Pareto Front),它是多目标优化问题的理想解集。 ### MOEAD的组成部分 1. **种群初始化**:算法首先随机生成初始种群,每个个体代表一个潜在的...

    MO-ASMO 的分布式控制器,一种基于代理的多目标优化算法(python)

    dmosopt-master 文件夹很可能是该算法的源代码仓库,其中可能包含算法的详细说明、示例代码、测试用例以及用户指南等文档。对于开发者而言,通过阅读这些资料,可以了解算法的工作原理,学习如何配置和运行算法,...

    基于自然连通度的复杂网络抗毁性仿真优化研究 (2013年)

    - **组合优化模型**:本文提出了一种以自然连通度为目标函数的组合优化模型,旨在寻找在特定约束条件下能够最大化网络抗毁性的最优解。这里的约束条件通常涉及到网络的规模、成本等因素。 - **禁忌搜索算法**: - ...

    多目标粒子群优化算法代码.rar

    在"多目标粒子群优化算法代码"中,可能包含了MOPSO的Python或其他编程语言实现,包括以上提到的关键步骤和策略。通过分析这些代码,我们可以深入理解MOPSO的工作原理,并将其应用于实际问题的求解。同时,代码也可能...

    matlabB样条轨迹规划,7次非均匀B样条轨迹规划,基于NSGAII遗传算法,实现时间 能量 冲击最优 换上自己的关节值和时

    本项目中,研究者提供了完整的MATLAB实现代码,同时为了降低学习门槛,也为初学者准备了带有中文注释的Python版本代码。这种跨平台的开放性设计,无疑降低了技术应用的门槛,使得无论是研究人员还是工程技术人员都...

    matlab遗传算法来求解有关物流设施选址的问题,比如物流配送中心.zip

    Python代码可以用于数据交换、结果预处理和后处理等任务。而C语言代码可以用来优化遗传算法中计算量大、耗时长的部分,提升整体的执行效率。 在实际应用中,用户需要根据具体的物流系统参数来调整遗传算法的参数...

    feature-selection_GA-SA-SAGA算法.rar

    在特征选择中,GA将特征集合视为个体的基因组,通过随机初始化、交叉、变异和选择等操作,模拟生物进化过程来逐步优化特征子集。交叉操作在两个个体间交换部分特征,变异操作随机改变个别特征,选择操作则依据特定...

    基于模拟退火的神经网络算法(matlab).zip

    在初始高温阶段,算法能够接受较劣的解,从而避免过早陷入局部最优;随着温度逐渐降低,算法逐渐倾向于接受更优的解,最终得到全局最优解。这种机制使得模拟退火在解决复杂优化问题时表现出较好的全局搜索能力。 在...

    遗传算法、禁忌搜索、模拟退火、蚁群算法

    模拟退火算法源自固体物理学中的退火过程,通过接受较劣解来跳出当前局部最优,以找到全局最优。在解决TSP时,算法会生成随机的相邻城市交换,根据温度和当前解的质量决定是否接受这一改变。随着温度逐渐降低,算法...

    开源项目-narqo-psqr.zip

    源代码通常包括算法的实现,可能有C、Python或其他编程语言的版本,便于不同背景的开发者使用。此外,可能还包括测试用例、示例数据以及文档,帮助用户理解和应用这个算法。 P-Square算法的工作原理大致如下: 1. ...

    数学建模模拟退火.rar

    5. 实践指导,如何在编程中实现模拟退火算法,可能涉及编程语言如Python、C++等的代码示例。 通过学习这个压缩包,不仅可以深入理解模拟退火算法,还能掌握如何将它应用于数学建模中,解决实际的优化问题。对于研究...

    启发式计算

    2. **模拟退火(Simulated Annealing)**:模拟退火算法灵感来源于金属冷却过程,它允许在搜索过程中接受较劣解以跳出局部最优。Python的`scipy.optimize.anneal`函数提供了一个简单的模拟退火实现。 3. **粒子群...

Global site tag (gtag.js) - Google Analytics