Skip to main content
 首页 » 编程设计

python之在不影响性能的情况下减少代码行

2025年05月04日17cloudgamer

我仍在学习 Python (3.5),我有一段代码需要为某些对象分配很多值,所以我想知道最优化的方法是什么。我问这个是因为我缺乏知识来理解循环中的“更少代码行”是否比不使用循环更耗时(文件大小更小,但处理增加了......也许吧?) .

方法一:

    # 01 
    self.lineReferencia1.setText(utilidades.ensure_its_str(registro[16])) 
    self.lineConcepto1.setText(utilidades.ensure_its_str(registro[17])) 
    self.lineCantidad1.setText(utilidades.ensure_its_str(registro[18])) 
    self.linePrecio1.setText(utilidades.ensure_its_str(registro[19])) 
    self.lineDescuento1.setText(utilidades.ensure_its_str(registro[20])) 
    # 02 
    self.lineReferencia2.setText(utilidades.ensure_its_str(registro[23])) 
    self.lineConcepto2.setText(utilidades.ensure_its_str(registro[24])) 
    self.lineCantidad2.setText(utilidades.ensure_its_str(registro[25])) 
    self.linePrecio2.setText(utilidades.ensure_its_str(registro[26])) 
    self.lineDescuento2.setText(utilidades.ensure_its_str(registro[27])) 
    # 03 
    self.lineReferencia3.setText(utilidades.ensure_its_str(registro[30])) 
    self.lineConcepto3.setText(utilidades.ensure_its_str(registro[31])) 
    self.lineCantidad3.setText(utilidades.ensure_its_str(registro[32])) 
    self.linePrecio3.setText(utilidades.ensure_its_str(registro[33])) 
    self.lineDescuento3.setText(utilidades.ensure_its_str(registro[34])) 
    # 04 
    self.lineReferencia4.setText(utilidades.ensure_its_str(registro[37])) 
    self.lineConcepto4.setText(utilidades.ensure_its_str(registro[38])) 
    self.lineCantidad4.setText(utilidades.ensure_its_str(registro[39])) 
    self.linePrecio4.setText(utilidades.ensure_its_str(registro[40])) 
    self.lineDescuento4.setText(utilidades.ensure_its_str(registro[41])) 

方法二:

    items = ( 
    (self.lineReferencia1, registro[16]), (self.lineConcepto1, registro[17]), (self.lineCantidad1, registro[18]), 
    (self.linePrecio1, registro[19]), (self.lineDescuento1, registro[20]), (self.lineReferencia2, registro[23]), 
    (self.lineConcepto2, registro[24]), (self.lineCantidad2, registro[25]), (self.linePrecio2, registro[26]), 
    (self.lineDescuento2, registro[27]), (self.lineReferencia3, registro[30]), (self.lineConcepto3, registro[31]), 
    (self.lineCantidad3, registro[32]), (self.linePrecio3, registro[33]), (self.lineDescuento3, registro[34]), 
    (self.lineReferencia4, registro[37]), (self.lineConcepto4, registro[38]), (self.lineCantidad4, registro[39]), 
    (self.linePrecio4, registro[40]), (self.lineDescuento4, registro[41])) 
    for i in items: 
        i[0].setText(utilidades.ensure_its_str(i[1])) 

注意:通过这种方法,我将 20 行代码减少到 10 行,但实际代码不只有 4 部分,它有 27 行,所以目标是减少 135 行代码。

方法 3:

使用字典而不是元组的元组来存储数据在处理时间上会更有效吗?

方法 4:

我应该为每个项目使用方法/函数而不是循环吗?

真正的问题:有没有其他方法可以减少该文件的代码行数而不影响性能或可读性?如何?为什么?

请您参考如下方法:

代码本身看起来像是开发得很糟糕的界面,但假设您必须使用它,您可以通过编程方式使用getattr 获取对象的属性。

所以,group ids,indexes reference points 和 attributes 并使 smth like

groups = (1, 2, 3, 4) 
attrs = ('Referencia', 'Concepto', 'Cantidad', 'Precio', 'Descuento') 
idx = (15, 22, 29, 38) 
 
for group, index in zip(groups, idx): 
    for i, attr in enumerate(attrs): 
        getattr(self, 'line' + attr + str(i)).setText(utilidades.ensure_its_str(registro[i+index])) 

关于整体代码质量:

  • 这样的命名(使用顺序名称)是非常糟糕的设计。如果您有序列 - 您可能需要按顺序存储此数据 - 将 lineReferencia 存储为对象列表
  • 您可能会在某个时候遇到这个问题,也可能不会,但请尝试为您的代码保留英文名称 - 这使得它对广泛的人来说更具可读性。有时它可能对代码库支持至关重要