我有import time
import random
def compute_optimal_weights(ids, prices):
scaled_sum = 0
for i in ids:
scaled_sum += prices[i] ** -0.25
result = {}
for i in ids:
result[i] = 0.67 * (prices[i] ** -0.25) / scaled_sum
return result
def compute_optimal_weights_old(input_sellers_ID, input_prices):
input_weights_optimal = {}
for i in input_sellers_ID:
sum_price_ratio_scaled = 0
for j in input_sellers_ID:
price_ratio = input_prices[i] / input_prices[j]
scaled_price_ratio = price_ratio ** c1
sum_price_ratio_scaled += scaled_price_ratio
input_weights_optimal[i] = c2 / sum_price_ratio_scaled
return input_weights_optimal
c1 = 0.25
c2 = 0.67
input_sellers_ID = range(10)
input_prices = {i: random.uniform(0,1) for i in input_sellers_ID}
start = time.clock()
for _ in range(1000000):
compute_optimal_weights_old(input_sellers_ID, input_prices) and None
old_time = time.clock() - start
start = time.clock()
for _ in range(1000000):
compute_optimal_weights(input_sellers_ID, input_prices) and None
new_time = time.clock() - start
print('Old:', compute_optimal_weights_old(input_sellers_ID, input_prices))
print('New:', compute_optimal_weights(input_sellers_ID, input_prices))
print('New algorithm is {:.2%} faster.'.format(1 - new_time / old_time))
,其中HashMap
为值。我想找不到。在Object
值Object
中出现的所有那些在属性中具有某些定义值的值。例如。如下所述:
HashMap
我想在hashmap中找到name =“robert”的出现次数。 什么是最有效的方法。我可以不用循环来做,因为我的hasрmap非常大。
答案 0 :(得分:2)
回答没有循环部分,而不是最有效的方式部分:你可以在没有使用Java 8 Streams的循环的情况下做到这一点,但这不会使它成为任何东西本身更有效率。
理论上,如果Map非常大,并行化可能会有所帮助。虽然在这种情况下它不太可能,因为filter
谓词在计算上真的很便宜。
无论如何,使用Java 8 Streams很容易实现并行化。
假设您的Employee类有一个getName()
方法,您可以尝试这样的
Map<Integer, Employee> emp = new HashMap<Integer, Employee>();
String name = "robert";
long count = emp.values()
.parallelStream()
.filter(e -> name.equals(e.getName()))
.count();
修改强>:
似乎由于并行流,我对潜在的运行时改进有点过于悲观。我在一个包含750_000个条目的HashMap测量的四核I7上做了一个小测试。
for
循环方法的改进始终为50%左右。也就是说,如果(并且只有!)你反复这样做,平均而言,你的处理速度可以加倍。
答案 1 :(得分:0)
除非你创造一种秩序,否则我认为不可能。例如,如果您将名称放在按键升序的位置,并且值按字典顺序排列,则可以使用复杂的O(log2(n))和旁路搜索算法按顺序放置和获取名称。
其他解决方案是在其他结构中以非常方式保存这种信息以获得更快的速度,例如哈希映射,其中键是名称,值是出现
希望这个帮助
答案 2 :(得分:0)
你可以尝试一种简单的方法(但不是最好的)
String name = "robert";
int count = 0;
for(Employee theEmployee: emp.values()) {
if (theEmployee.getName().equals(name)) {
count++;
}
}
编辑:我发现你的代码中有一些内容 - &gt;你像这样添加到哈希地图
emp.put(1, E1);
emp.put(2, E2);
emp.put(3, E3);
不是
emp.add(1, E1);
emp.add(2, E2);
emp.add(3, E3);