enumerate in dictionary loop 耗时长如何提高速度
enumerate in dictionary loop take long time how to improv the speed
我正在使用 python-3.x 我想在每个循环中加快我的代码速度,我正在创建新值并通过使用检查它们是否存在于字典中(check if) 如果索引存在于字典中,我将保留索引所在的位置。我正在使用枚举,但它需要很长时间并且非常清晰。 是否有任何方法可以通过使用其他方式来加速我的代码,或者在我的情况下枚举是我需要使用的唯一方式?我不确定在我的情况下使用 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"]
所以据我所知你是
- 从 -1000 到 1000 之间的线性分布中创建 256 个随机数
- 从中生成 100 个三元组(由于
unique
,可能少于 100 个,但很有可能恰好是 100 个)
- 然后重复几乎相同的事情 100 次,每次检查新列表中的每个三元组是否存在于旧列表中。
- 然后您将尝试计算每个元素出现的频率。
我想知道你为什么要这样做,因为这对我来说没有多大意义,但我会给出一些建议:
- 没有理由制作字典 dic_t 如果你只想保留其中的对象,只需使用两个变量
my_array_uniq
和 counts
- 您正在处理浮点数的三元组。在给定的范围内,这应该给你大约 10^48 个不同的可能三胞胎(我可能对确切数字有误,但无论哪种方式都是一个荒谬的大数字)。您生成它们的方式确实减少了总数 phase-space 相当多,但还远远不够。找到相同的概率非常非常低。
- 如果您有一组对象(在本例中为数字三元组)并且您想要确定您之前是否见过给定的对象,则需要使用集合。集合只能包含不可变对象,因此您想将三元组变成元组。确定给定的三元组是否已包含在您的集合中是一个 O(1) 操作。
- 为了计算某事的出现次数,collections.Counter 是要使用的自然数据结构。
我正在使用 python-3.x 我想在每个循环中加快我的代码速度,我正在创建新值并通过使用检查它们是否存在于字典中(check if) 如果索引存在于字典中,我将保留索引所在的位置。我正在使用枚举,但它需要很长时间并且非常清晰。 是否有任何方法可以通过使用其他方式来加速我的代码,或者在我的情况下枚举是我需要使用的唯一方式?我不确定在我的情况下使用 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"]
所以据我所知你是
- 从 -1000 到 1000 之间的线性分布中创建 256 个随机数
- 从中生成 100 个三元组(由于
unique
,可能少于 100 个,但很有可能恰好是 100 个) - 然后重复几乎相同的事情 100 次,每次检查新列表中的每个三元组是否存在于旧列表中。
- 然后您将尝试计算每个元素出现的频率。
我想知道你为什么要这样做,因为这对我来说没有多大意义,但我会给出一些建议:
- 没有理由制作字典 dic_t 如果你只想保留其中的对象,只需使用两个变量
my_array_uniq
和counts
- 您正在处理浮点数的三元组。在给定的范围内,这应该给你大约 10^48 个不同的可能三胞胎(我可能对确切数字有误,但无论哪种方式都是一个荒谬的大数字)。您生成它们的方式确实减少了总数 phase-space 相当多,但还远远不够。找到相同的概率非常非常低。
- 如果您有一组对象(在本例中为数字三元组)并且您想要确定您之前是否见过给定的对象,则需要使用集合。集合只能包含不可变对象,因此您想将三元组变成元组。确定给定的三元组是否已包含在您的集合中是一个 O(1) 操作。
- 为了计算某事的出现次数,collections.Counter 是要使用的自然数据结构。