- 主题:就统计一下循环执行了多少次,要200多个小时?如何优化啊?
from time import time as Now
t = Now()
sum=0
for i in range(0,1027):
if (i % 100 == 0):
print("i = ", i)
for j in range(i+1,1028):
for k in range(j+1,1029):
#for l in range(k+1,1029):
sum= sum+1
print("sum = ",sum)#三重循环的次数是 sum = 181062154,用时 15.6秒。 四个数的循环次数是 sum = 46442442501 = C(10269,4),耗时一个小时
print(f"np:{Now()-t}")
这段代码,三重循环的次数,就是C(1029,3) 组合数。四重循环的次数,就是C(1029,4)。三重循环用时15.6秒,四重循环要一个多小时。五重循环的话,要C(1029,5)/C(1029,4)=200+,难道我就统计一下循环执行的次数,要200多个小时吗?有没有可以改进的方法啊?我还要做其他运算呢。谢谢
就跑一下这个程序,cpu根本没用满,才50%不到。如何让cpu满负荷工作啊?
--
修改:feng321 FROM 120.242.253.*
FROM 120.242.253.*
用多cpu,或者gpu,可能加速吗?
--
FROM 120.242.253.*
python里,执行大数相乘,或者大整数除法,时间都可以忽略不计,近似等于0. 关键的时间消耗还是在n重循环上。1029*1029*1029的三重循环,竟然耗掉了我60秒。这个如何加速啊?
【 在 sysumove 的大作中提到: 】
: Python效率这么低,换c++或者fortran
: 发自「今日水木 on LIO-AN00」
--
FROM 120.242.253.*
回复没有内容啊
【 在 iMx 的大作中提到: 】
:
--
FROM 120.242.253.*
#五个素数的乘积
sum=0
for i1 in range(0,1025):
if (i1 % 50 == 0):
print("i1 = ", i1,"*********************")
print(f"第一重循环,每50个耗时 np:{Now()-t}")
t = Now()
for i2 in range(i1+1,1026):
if (i2 % 100 == 0):
print("i2 = ", i2)
for i3 in range(i2+1,1027):
for i4 in range(i3+1,1028):
for i5 in range(i4+1,1029):
sum =sum +1
print(sum)
这段代码,我算了一下,估计要200个小时才能执行完。有加速的办法吗?谢谢
--
FROM 120.242.253.*
是的,所以我也很郁闷,暂时想不到其他好的办法。题目是:从这1029个数中取出m个数(0<m<=1029),然后算这m个数的乘积M,然后对M的每个因子k,要求 k-1 整除 M-1,k+1 整除M+1.这样的M如何找啊?
【 在 blueboats 的大作中提到: 】
: 看了一下你的原始问题,不说你的问题能不能求解吧,你这个取几个数可是无上限的吧,你打算一直用循环来写?
: 取4个数的时候你用4重循环,那取10个数你就用10重循环了?
: from time import time as Now
: ...................
--
FROM 120.242.253.*
numba支持的最大整数,是多少位的啊?刚才一个网友向我推荐taichi,可我的结果最大有一万位整数(十进制的)。哎。。。本来我的五个数循环,做到一半了,听他的停掉循环以为用taichi,现在看来一个星期白跑了。哎。。。。
有支持上万位的整数的加倍方法?
一个星期白跑了。。。。。一个星期没关过机
【 在 shmilhong 的大作中提到: 】
: numba 了解一下
: 应该有点用
--
FROM 120.242.253.*
谢谢大佬的代码。可是我这个列表有1000个数,我统计了下,C(1000,3),取3个出来计算的话,耗时3.3分钟。如果是C(1000,5)的话,估计是C(1000,3) 的5万倍,那就要耗时 50000 *3.3 分钟 =2750小时 ==115 天,这也太慢了吧?有好的办法加速吗?
【 在 poggy 的大作中提到: 】
:
: python学习任重道远啊,呵呵
: 熟悉语言基本语法, 只是初级接触
: ...................
--
FROM 120.242.253.*
差不多目前只能这样。三重循环耗时3.3分钟。五重循环估计要耗时115天,也太慢了。有好的办法加速吗?
【 在 blueboats 的大作中提到: 】
: 看了一下你的原始问题,不说你的问题能不能求解吧,你这个取几个数可是无上限的吧,你打算一直用循环来写?
: 取4个数的时候你用4重循环,那取10个数你就用10重循环了?
: from time import time as Now
: ...................
--
FROM 120.242.253.*