Как ускорить или заменить вложенные циклы - PullRequest
1 голос
/ 25 февраля 2020

Могу ли я спросить, есть ли другой способ ускорить или заменить вложенные циклы?

Я пытаюсь захватить данные из файла Excel, есть 66 строк данных с каждой "A, B, C, D "строк

import xlwings as xw
import glob as glob   
import itertools   
letters = ['A','B','C','D'] 
    for i in range(66):
            for j in range(len(letters)):
                sht1 = wb.sheets['Pallet Configurations']
                val = (sht1.range(letters[j] + str(i+2)).options(numbers=str).value)
                valueList[j].append(val)

Я пытаюсь использовать itertools.product, но он не работает.

    for i, j in itertools.product(66,len(letters)):
        sht1 = wb.sheets['Pallet Configurations']
        val = (sht1.range(letters[j] + str(i+2)).options(numbers=str).value)
        valueList[j].append(val)

1 Ответ

2 голосов
/ 25 февраля 2020

Я не уверен, какую именно библиотеку вы используете для манипулирования тем, что выглядит как листы рабочей книги, однако вам не нужно каждый раз устанавливать в вашем внутреннем sht1 значение для l oop. Ваш код может быть записан как:

sht1 = wb.sheets['Pallet Configurations']
letters = ['A','B','C','D'] 
for i in range(66):
        for j in range(len(letters)):
            val = (sht1.range(letters[j] + str(i+2)).options(numbers=str).value)
            valueList[j].append(val)

Это должно сэкономить вам необходимость каждый раз звонить .sheets на wb. Кроме того, похоже, что любая библиотека, которую вы используете, может одновременно считывать несколько ячеек. Вероятно, было бы дешевле прочитать всю строку один раз, прежде чем ввести свой внутренний l oop. Затем вы можете воспользоваться Python List.extend() методом, чтобы добавить весь список ячеек к valueList.

Пример кода может выглядеть следующим образом:

sht1 = wb.sheets['Pallet Configurations']
letters = ['A','B','C','D'] 
for i in range(66):
    for j in range(len(letters)):
        letter = str(letters[j])
        vals = (sht1.range("{0}{1}{0}{2}".format(letter, "2:", "66").options(numbers=str).value)
        valueList[j].extend(val)

Это все еще не идеально, и, возможно, есть другие способы ускорить ваши циклы. Вам нужно подумать о минимизации того, что делается в вашем l oop.

...