Сделать мои вложенные циклы проще (время работы выше) - PullRequest
0 голосов
/ 05 февраля 2019

Я учусь на вложенных циклах в Python.

Ниже я написал свой код.Я хочу упростить мой код, поскольку, когда я запускаю код, для получения результата требуется так много времени.

У меня есть список, содержащий 1000 значений:

Brake_index_values = [ 44990678,  44990679,  44990680,  44990681,  44990682,  44990683,
             44997076,  44990684,  44997077,  44990685,
            ...
             44960673,   8195083,   8979525, 100107546,  11089058,  43040161,
             43059162, 100100533,  10180192,  10036189]

Яхранение элемента № 1 в другом списке

original_top_brake_index = [Brake_index_values[0]]

Я создал временный список с именем temp и массивом numpy для итерации по циклу:

temp =[]
arr = np.arange(0,1000,1)

Операция цикла:

for i in range(1, len(Brake_index_values)):
    if top_15_brake <= 15:
        a1 = Brake_index_values[i]
        #a2 = Brake_index_values[j]
        a3 = arr[:i]
        for j in a3:
            a2 = range(Brake_index_values[j] - 30000, Brake_index_values[j] + 30000)
            if a1 in a2:
                pass
            else:
                temp.append(a1)
        if len(temp)== len(a3):
            original_top_brake_index.append(a1)
            top_15_brake += 1
            del temp[:]
        else:
            del temp[:]
            continue

Я сравниваю элемент Brake_index_values[1], доступный в диапазоне от 30000 до и после элемента Brake_index_values[0], то есть `range (Brake_index_values ​​[0] -30000, Brake_index_values ​​[0] +30000).

Если Brake_index_values[1] доступно между диапазонами, я должен игнорировать этот элемент и перейти к следующему элементу Brake_index_values[2] и следовать тому же процессу, что и ранее для Brake_index_values[0] & Brake_index_values[1]

Если этодоступно, сохраните значение в original_top_brake_index тщательной операции добавления.

Другими словами:

(Давайте возьмем 3 значения a, b и c. Я проверяю, находится ли значение b в диапазоне между (a-30000 до + 30000). Возможность 1: Если b находится между (a-30000 до + 30000), игнорируйте этот элемент (Здесь я храню во временном списке). Затем тот же процесс продолжается с c (следующий элемент) Возможность 2: Если b не в b/ w эти диапазоны помещают b в другой список с именем original_top_brake_index (этот другой список является фактическим результатом, который мне нужен)

Результат, который я получаю:

Это работает, но это занимает так много временичтобы завершить операцию, и иногда это показывает MemoryError.

Я просто хочу, чтобы мой код работал проще и эффективнее с простыми операциями.

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Попробуйте этот код (с numpy):

import numpy as np
original_top_brake_index = [Brake_index_values[0]]
top_15_brake = 0
Brake_index_values = np.array(Brake_index_values)
for i, a1 in enumerate(Brake_index_values[0:]):
    if top_15_brake > 15:
        break
    m = (Brake_index_values[:i] - a1)
    if np.logical_or(m > 30000, m < - 30000).all():
        original_top_brake_index.append(a1)
        top_15_brake += 1

Примечание: вы, вероятно, можете сделать его еще более эффективным, но это уже должно значительно сократить количество операций (и не сильно изменить логикувашего исходного кода)

0 голосов
/ 05 февраля 2019

Мы можем использовать модуль bisect, чтобы сократить элементы, которые мы на самом деле должны искать, найдя наименьший элемент, который больше или меньше текущего значения.Мы будем использовать рецепты из здесь

Давайте рассмотрим этот пример:

from bisect import bisect_left, bisect_right

def find_lt(a, x):
    'Find rightmost value less than x'
    i = bisect_left(a, x)
    if i:
        return a[i-1]
    return

def find_gt(a, x):
    'Find leftmost value greater than x'
    i = bisect_right(a, x)
    if i != len(a):
        return a[i]
    return

vals = [44990678,  44990679,  44990680,  44990681,  44990682, 589548954, 493459734, 3948305434, 34939349534]

vals.sort()  # we have to sort the values for bisect to work
passed = []
originals = []

for val in vals:
    passed.append(val)
    l = find_lt(passed, val)
    m = find_gt(passed, val)
    cond1 = (l and l + 30000 >= val)
    cond2 = (m and m - 30000 <= val)
    if not l and not m:
        originals.append(val)
        continue
    elif cond1 or cond2:
        continue
    else:
        originals.append(val)

Что дает нам:

print(originals)

[44990678, 493459734, 589548954, 3948305434, 34939349534]

Может быть другойБолее математический способ сделать это, но это должно по крайней мере упростить ваш код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...