我有一个相当大的循环,需要运行500次,而且我是新手使用编程语言并进行这种类型的模拟。
但是我需要记录每次运行的结果,如果列表(table1)包含全0,全1或两者的混合。
我只是想知道哪种方法最快找出500个模拟的比例,导致列表包含全部0,全部1或混合,如果追加会减慢太多。
for x in range(0, 500):
times = 300
gamma_val = 2
table1 = [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
total = 0.0
while total < times:
table = [0 for i in range (21)]
for d1 in range(21):
if table1[d1]:
table[d1] = -(1/gamma_val)*math.log((random.random()))
else:
table[d1] = -(math.log(random.random()))
####Goes on to make new table1 with changes, either all 1's, all 0's or a mix of 0s #########and 1s
files1 = 0
files01 = 0
files0 = 0
if "1" "0" in table1 == True:
files01 += 1
elif 1 in table == True:
files1 += 1
elif 0 in table1 == true:
files0 += 1
答案 0 :(得分:0)
为了选择追加的位置,在while循环之前创建2个布尔变量(Has1s和Has0s),每个都初始化为False。每当你得到1&amp; 1时,将Has1s设置为True。当你得到0时有Has0s - 然后你在最后避免(最多)3次搜索。
答案 1 :(得分:0)
最后你到底需要什么?
如果你只是想知道所有1,所有0或混音的比例,那么增加变量值而不是生成列表似乎更直观(至少对我来说)。如果您设置代码如下:
...
files1=0
files01=0
files0=0
if 1 in table1 and 0 in table1:
files01 += 1
elif 1 in table:
files1 += 1
elif 0 in table1:
files0 += 1
...
然后你不必在最后做一个len(files01)
来知道有多少人混合了1和0。
答案 2 :(得分:0)
append()
没有速度丢失,相比于多次扫描事物所造成的速度损失。与计算相比,内存操作损失的时间非常少。所以不要担心。我可能不会保留计数,如果我可以从你想要累积的列表的长度中得到它们。一次完成所有事情更具可读性。制作东西,然后数数。
我相信标准容器相对于算法速度的决策。所以我将行转换为Set并与Set([0]),Set([1])和Set([0,1])进行比较。我假设'in'将对该行进行双重扫描,而Set()将进行一次传递。
BOTH = set([0, 1])
results = {'0': [], '1': [], '01': []}
.... make the list ....
elements = set(table)
if elements == BOTH:
results['01'].append(table)
else if 1 in elements:
results['1'].append(table)
else:
results['0'].append(table)
我会尝试挑选风格,而不是直接错误:
使用最后的其他,不要用尽所有条件;它真的更具可读性。分别耗尽所有这些让读者想知道你想象的可能会留下什么样的情况。它滋生了偏执狂。
一般来说,实际上将事物与True或False进行比较是非pythonic。检查与常量True的相等性是在Python中获取所需条件的最不可靠的方法。有很多Python习语依赖于语句的真实性,它由对象的存在或列表的非空性来表示。因此,您将面对程序员从辅助函数返回True或False以外的东西来表示布尔确定。习惯于不要挑剔。
此外,看似痛苦, 与其他比较运营商链条混合时好像是&lt; ,这对于非分析师来说是非惯用的你应该从不这样做。