减少代码行数而不影响性能

Sae*_*yth 1 python python-3.x

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

方法1:

    # 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]))
Run Code Online (Sandbox Code Playgroud)

方法2:

    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]))
Run Code Online (Sandbox Code Playgroud)

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

方法3:

在使用时,使用dict来存储数据而不是元组元组会更有效吗?

方法4:

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

真正的问题:在不影响性能或可读性的情况下,还有其他方法可以减少该文件的代码行数吗?怎么样?为什么?

Sla*_*lam 6

代码本身看起来像是非常开发的接口,但假设你必须使用它,你可以使用getattr以编程方式获取对象的属性

因此,组ID,索引参考点和属性,并使smth像

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]))
Run Code Online (Sandbox Code Playgroud)

关于整体代码质量:

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