超算第三次考核
任务一:
(1)列表生成式:
主要运用到推导式的内容。
list1 = [i for i in range(10,61,10)]
print(list1)
list2 = [i*i for i in range(1,8)]
print(list2)
list3 = [i*int((-1)**(i/10))*-1 for i in range(10,61,10)]
print(list3)
list4 = [i for i in range(10,61,10) if i%20 != 0]
print(list4)
#运行结果
#[10, 20, 30, 40, 50, 60]
#[1, 4, 9, 16, 25, 36, 49]
#[10, -20, 30, -40, 50, -60]
#[10, 30, 50]
一行内生成乘法表:
print("\n".join("\t".join(["{}*{}={}".format(j,i,i*j) for j in range(1,i+1)])for i in range(1,10)))
该行代码用了join
函数,里层的join
在每个算式后加上制表符分割开算式,外层join
在每次应该换行的时候加入一个换行符,具体表现为i
每加一换行一次。
除了上述之外,还有下面这个方法。
[print("{}*{}={}".format(j,i,i*j) ,end = "\n" if i == j else "\t")for i in range(1,10) for j in range(1,i+1)]
该行代码运用print
函数的end
和三元运算符,来控制到底是换行还是输出制表符。
(2)计时器对象:
import time as t
class Timer:
def __init__(self):
self.timelist = []
def start(self):
self.begin = t.perf_counter()
def stop(self):
self.end = t.perf_counter()
self.timelist.append(self.end-self.begin)
return self.timelist[-1]
def avg(self):
sum = self.sum()
return sum / len(self.timelist)
def sum(self):
sum = 0
for i in self.timelist:
sum += i
return sum
def cumsum(self):
cumsumlist = []
for i in self.timelist:
if cumsumlist:
cumsumlist.append(i+cumsumlist[-1])
else:
cumsumlist.append(i)
return cumsumlist
a = b = 1
timer = Timer()
timer.start()
d = a + b
print(f'{timer.stop():.5f} sec')
#输出
#0.00003 sec
完成计时器对象需要调用time库,库中有几个可用于计时的函数。
1.time.time()
返回自1970年1月1日00:00:00(UTC)以来经过的时间,单位为秒。可调用两次求差值,来计算时间差。通过改变系统时间可以改变time.time()的值。因为精度不高而且会受系统时间影响,所以适合用来表示日期时间或者大程序程序的计时。(包含sleep()的时间)
2.time.process_time()
返回当前进程的系统和用户CPU时间之和(以小数秒为单位)。不包含睡眠时间,也是通过调用两次求差值计算经过时间。精度比time.time()高。
3.time.perf_counter()
返回性能计数器的值(以小数秒为单位),包含睡眠时间,调用也和上述两种方法一样,但是精度更高,在计算小程序的运行时间使用perf_counter可以获得更加准确的时间差,所以我这里使用time.perf_counter()。
此外还有time.clock()方法,但是在python3.8之后废除了,所以用以上三种方法代替。
同时python还提供了精确到纳秒的计时方法(返回的是整型。):
time.time_ns()
time.process_time_ns()
time.perf_counter_ns()
(3)累加器 Accumulator 类
class Accumulator:
def __init__(self,n):
self.list = [0] * n
def add(self, *args):
j = 0
for i in args:
self.list[j] += i
j += 1
def reset(self):
self.list = [0] * len(self.list)
def __getitem__(self, idex):
return self.list[idex]
通过输入的n
来创建列表,来完成累加。
(4)斐波那契数生成函数
def fib():
f1 = 1
f2 = 1
yield print(f1)
while True:
f3 = f1 + f2
f1 = f2
f2 = f3
yield print(f1)
a = fib()
for i in range(5):
next(a)
#输出
'''
1
1
2
3
5
'''
该段代码主要运用到yield
方法。yield方法可以看作函数中的return,含有yield的函数也不在是一个简单的函数,它变成了一个生成器,当生成一个函数对象时,先不会执行函数内容,而是先产生生成器。
该生成器含有一个函数next(),当调用next()时将执行函数返回yield后面的值。每次调用next()都从上一次返回后的位置开始执行。
简单来说,yield就是 return 返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后开始。
任务二:
任务三:
对于任务三,主要是看李沐动手学深度学习的视频配合快速入门Pytorch
,简单的了解一些:数据操作、数据预处理、线性代数以及矩阵导数的内容,还有线性回归模型相关内容。
老师的视频大部分还是挺细致的,但光看视频还是有一些不太清楚的地方,比如,数学方面:线性回归模型的代价函数为什么是凸函数,正向累积和反向累积的区别,什么是累积梯度; 还有对老师在视频中一些没有详细介绍的一些库函数,不是很了解,如:os
库,panda
库·,以及torch
库中的一些函数,这些都还需要多多查找资料进行学习。