- 主题:就统计一下循环执行了多少次,要200多个小时?如何优化啊?
回复没有内容啊
【 在 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.*
看了一下你的原始问题,不说你的问题能不能求解吧,你这个取几个数可是无上限的吧,你打算一直用循环来写?
取4个数的时候你用4重循环,那取10个数你就用10重循环了?
【 在 feng321 的大作中提到: 】
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 117.25.182.114
numba 了解一下
应该有点用
【 在 feng321 的大作中提到: 】
: from time import time as Now
: t = Now()
: sum=0
: ...................
--
FROM 120.245.98.*
是的,所以我也很郁闷,暂时想不到其他好的办法。题目是:从这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.*
n取m的不重复无序组合,用itertools.conbinations啊。
但是依旧不能解决算得慢的问题。
【 在 feng321 的大作中提到: 】
: 是的,所以我也很郁闷,暂时想不到其他好的办法。题目是:从这1029个数中取出m个数(0<m<=1029),然后算这m个数的乘积M,然后对M的每个因子k,要求 k-1 整除 M-1,k+1 整除M+1.这样的M如何找啊?
--
修改:adoal FROM 183.157.161.*
FROM 183.157.161.*
【 在 adoal 的大作中提到: 】
: n取m的不重复无序组合,用itertools.conbinations啊。
: 但是依旧不能解决算得慢的问题。
:
python学习任重道远啊,呵呵
熟悉语言基本语法, 只是初级接触
然后, 要习惯现代计算机语言, 向量化编程, 函数式编程, CPU和GPU多核处理,才是走向生产力。
针对你这个小问题,
第一阶段, 解决方案就是废弃循环, 采用向量化处理,使用迭代,切片,向量矩阵替代循环, if else,
迭代处理可以使用itertools, 里面有两个函数专门处理排列组合,
类似于:
from itertools import combinations, permutations
result=[(lambda x,y,z: (x,y,z) if ((x*y*z+1)%x==0 or (x*y*z+1)%y==0 or (x*y*z+1)%z==0) and((x*y*z-1)%x==0 or (x*y*z-1)%y==0 or (x*y*z-1)%z==0) else None)(x,y,z) for x,y,z in combinations([2,3,5,7,11,13,17,19,23,29,31],3)]
print(result)
python的向量化基本可以以详细学习numpy作为入门。
多核方面内容就会很多, 有python御用的库, 这类在大数据处理会有很多介绍。
如果, 灵活性还不够, 需要通过C/C++扩展实现, 毕竟在多核的GPU和CPU高性能计算的库, 基本上都会有C++语言封装的SDK, C++语言在多个操作系统在这个领域支持也一直处于近似统治地位。
--
FROM 115.171.245.*
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.*