2010-06-15 61 views
-1

我明白,下面给出的代码将不会被完全理解,除非我解释我的整个代码的前一行和下一行。 但是这是代码的一部分,导致我的项目延迟很多,并希望优化。 我想知道哪个代码部分是错误的,怎么可能被替换。 我想,很少有人能说是比较的是使用该功能的沉重和其他ligher方法都可以做这项工作此代码是否可以进一步优化?

请大家帮忙,

在此先感谢

for i in range(len(lists)): 
    save=database_index[lists[i]] 
    #print save 
    #if save[1]!='text0194'and save[1]!='text0526': 
    using_data[save[0]]=save 
    p=os.path.join("c:/begpython/wavnk/",str(str(str(save[1]).replace('phone','text'))+'.pm')) 
    x1=open(p , 'r') 
    x2=open(p ,'r') 
    for i in range(6): 
     x1.readline() 
     x2.readline() 
    gen = (float(line.partition(' ')[0]) for line in x1) 
    r= min(enumerate(gen), key=lambda x: abs(x[1] - float(save[4]))) 
    #print r[0] 
    a1=linecache.getline(str(str(p).replace('.pm','.mcep')), (r[0]+1)) 
    #print a1 
    p1=str(str(a1).rstrip('\n')).split(' ') 
    #print p1 
    join_cost_index_end[save[0]]=p1 
    #print join_cost_index_end 

    gen = (float(line.partition(' ')[0]) for line in x2) 
    r= min(enumerate(gen), key=lambda x: abs(x[1] - float(save[3]))) 
    #print r[0] 
    a2=linecache.getline(str(str(p).replace('.pm','.mcep')), (r[0]+1)) 
    #print a2 
    p2=str(str(a2).rstrip('\n')).split(' ') 
    #print p2 
    join_cost_index_strt[save[0]]=p2 
    #print join_cost_index_strt 
    j=j+1 

    #print j 
    #print join_cost_index_end 
    #print join_cost_index_strt 
    enter code here 

这里我database_index有约2,50,000个条目'

+5

你应该学习的一件事是避免一个字母变量。 – systempuntoout 2010-06-15 14:35:53

+8

缺乏评论和描述性变量名称可能会使贵公司比缺乏优化成本更多。 – Stephen 2010-06-15 14:36:22

+3

当你跑分析器时,你学到了什么? – 2010-06-15 14:37:50

回答

3
def get_list(file, cmp, fout): 
    ind, _ = min(enumerate(file), key=lambda x: abs(x[1] - cmp)) 
    return fout[ind].rstrip('\n').split(' ') 

root = r'c:\begpython\wavnk' 
header = 6 
for lst in lists: 
    save = database_index[lst] 
    index, base, _, abs2, abs1, *_ = save 
    using_data[index] = save 

    base = os.path.join(root, base.replace('phone', 'text')) 
    fin, fout = base + '.pm', base + '.mcep' 
    file = open(fin) 
    fout = open(fout).readlines() 
    [next(file) for _ in range(header)] 
    file = [float(line.partition(' ')[0]) for line in file] 
    join_cost_index_end[index] = get_list(file, float(abs1), fout) 
    join_cost_index_strt[index] = get_list(file, float(abs2), fout) 

不要:

  1. 字符串转换为字符串多次,它会保持一个字符串
  2. 循环中
  3. 转换值时,它可以在循环
  4. 采用单外完成意思变量的字母
  5. 迭代序列与range(len(sequence))
  6. 复制粘贴位的代码:使用函数ons
  7. 使用任何代码而不先读取文档
  8. 依靠SO进行心理调试。
+0

谢谢!请检查一下! 你的启发! – kaki 2010-06-15 15:42:45

+0

将迭代序列与范围(len(序列))减缓执行我在整个项目中使用类似的代码 – kaki 2010-06-15 15:57:15

+0

@kaki:当然,也许不是显着,但它会。更重要的是,它不是pythonic。 – SilentGhost 2010-06-15 16:16:55

1
x1=open(p , 'r') 
x2=open(p ,'r') 

为什么要打开同一个文件两次?你期待它改变吗?