Перечисление в цикле словаря занимает много времени, как улучшить скорость

Я использую python-3.x, и я хотел бы ускорить свой код, где в каждом цикле я создаю новые значения, и я проверял, существуют ли они в словаре или нет, используя (проверить, если), тогда я буду хранить индекс там, где он есть найдено, если оно существует в словаре. Я использую перечисление, но это занимает много времени и очень четкий способ. есть ли способ ускорить мой код, используя другой способ, или в моем случае перечисление - единственный способ, с которым мне нужно работать? Я не уверен, что в моем случае использование numpy будет лучше.

Вот мой код:

# import numpy
import numpy as np

# my first array
my_array_1 = np.random.choice ( np.linspace ( -1000 , 1000 , 2 ** 8 ) , size = ( 100 , 3 ) , replace = True )
my_array_1 = np.array(my_array_1)




# here I want to find the unique values from my_array_1
indx = np.unique(my_array_1, return_index=True, return_counts= True,axis=0)


#then saved the result to dictionary
dic_t= {"my_array_uniq":indx[0], # unique values in my_array_1
       "counts":indx[2]} # how many times this unique element appear on my_array_1


# here I want to create random array 100 times 
for i in range (100):

    print (i)

    # my 2nd array
    my_array_2 = np.random.choice ( np.linspace ( -1000 , 1000 , 2 ** 8 ) , size = ( 100 , 3 ) , replace = True )
    my_array_2 = np.array(my_array_2)


#   I would like to check if the values in my_array_2 exists or not in the dictionary (my_array_uniq":indx[0])
#   if it exists then I want to hold the index number of that value in the dictionary and
#    add 1 to the dic_t["counts"], which mean this value appear agin and cunt how many.
#   if not exists, then add this value to the dic (my_array_uniq":indx[0])
#    also add 1 to the dic_t["counts"]
    for i, a in enumerate(my_array_2):

        ix = [k for k,j in enumerate(dic_t["my_array_uniq"]) if (a == j).all()]    
        if ix:

            print (50*"*", i, "Yes", "at", ix[0])     
            dic_t["counts"][ix[0]] +=1    

        else:
#            print (50*"*", i, "No")        
            dic_t["counts"] =  np.hstack((dic_t["counts"],1))
            dic_t["my_array_uniq"] = np.vstack((dic_t["my_array_uniq"], my_array_2[i]))

объяснение:

1- I will create an initial array.
2- then I want to find the unique values, index and count from an initial array by using (np.unique).
3- saved the result to the dictionary (dic_t)
4- Then I want to start the loop by creating random values 100 times.
5- I would like to check if this random values in my_array_2 exist or not in the dictionary (my_array_uniq":indx[0])
6- if one of them exists then I want to hold the index number of that value in the dictionary.
7 - add 1 to the dic_t["counts"], which mean this value appears again and count how many.
8- if not exists, then add this value to the dic as new unique value (my_array_uniq":indx[0])
9 - also add 1 to the dic_t["counts"]
np.random.choice это возвращает тебя ndarray. Нет необходимости определять его снова.
shaik moeed 27.05.2019 18:37

@shaikmoeed это может быть одно, но главная проблема внутри цикла, где я перечисляю

azeez 27.05.2019 18:53

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

JohnO 27.05.2019 18:54

@azeez Да, ты прав. Вы должны думать об эффективной логике, сохраняя вызовы. Вы повторяете 3 цикла for. Зачем? Но ваше требование похоже на то, что вам нужен индекс элемента в другом списке (или dict?). Правильно ли я понимаю? Нет! Можете ли вы объяснить ясно?

shaik moeed 27.05.2019 19:03

Рассмотрите вопрос о Обзор кода. Похоже, вы хотите создать 101 случайный массив и добавить в каждый вхождение уникальных чисел. Это правильно?

Jeppe 27.05.2019 19:15

@JohnO Я добавил объяснение шаг за шагом, чтобы сделать его более понятным. @shaik moeed @shaikmoeed Я хочу проверить появление и сохранить индекс, потому что я хочу добавить 1 к dic_t["counts"], чтобы подсчитать, сколько раз оно появилось. Да @Jeppe, но я также хочу сохранить индекс.

azeez 27.05.2019 19:25

Итак, вам нужен индекс, чтобы увеличить счетчик, соответствующий ключу? Разве вы не можете просто использовать вхождение в качестве ключа и считать его значением? Затем вы можете сэкономить много циклов, например, ix = [k for k,j in enumerate(dic_t["my_array_uniq"]) if (a == j).all()] становится if a in dic_t: ...

Jeppe 27.05.2019 19:48
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, из того, что я вижу, вы

  • Создание 256 случайных чисел из линейного распределения чисел между -1000 и 1000
  • Генерация 100 троек из них (может быть меньше 100 из-за unique, но с подавляющей вероятностью будет ровно 100)
  • Затем проделав почти одно и то же 100 раз и каждый раз проверяя каждую из троек в новом списке, существуют ли они в старом списке.
  • Затем вы пытаетесь подсчитать, как часто встречается каждый элемент.

Мне интересно, почему вы пытаетесь это сделать, потому что для меня это не имеет особого смысла, но я дам несколько советов:

  • Нет смысла делать словарь dic_t, если вы собираетесь хранить в нем только объекты, просто используйте две переменные my_array_uniq и counts
  • Вы имеете дело с тройками чисел с плавающей запятой. В данном диапазоне это должно дать вам около 10 ^ 48 различных возможных троек (я могу ошибаться в точном числе, но в любом случае это абсурдно большое число). То, как вы их генерируете, немного уменьшает общее фазовое пространство, но далеко не достаточно. Вероятность найти одинаковые очень мала.
  • Если у вас есть набор объектов (в данном случае количество триплетов) и вы хотите определить, видели ли вы данный объект раньше, вы хотите использовать наборы. Наборы могут содержать только неизменяемые объекты, поэтому вы хотите превратить триплеты в кортежи. Определение того, содержится ли данный триплет уже в вашем наборе, является операцией O (1).
  • Для подсчета количества вхождений sth collections.Counter является естественной структурой данных для использования.

Другие вопросы по теме