1、随机生成一个大文件(5G以上),查找里面内容最长的N(N>5)行,并打印出来
[root@saltstack-ui ~]# cat gen_large_file.py
import os
with open("a.txt", "w") as f:
f.write(os.urandom(1024*1024*1024*5)) # 产生一个5G大小的文件,里面都是随机内容,耗时长,有待改进
[root@saltstack-ui ~]# cat find_large_line.py # 利用list sort来排列,然后打印最长的5行
log_path='a.txt'
N=5
with open(log_path) as f:
a = [ line for line in f ]
a.sort(key=lambda x:len(x),reverse=True)
for i in range(N):
print "%d %s" %(i+1,a[i])
# 下面看种省内存的实现:
try:
with open(log_path) as f:
for line in f:
aList.append(line)
aList.sort(key=lambda x:len(x),reverse=True)
if len(aList) > N:
del aList[N:]
except IOError:
print "IO error"
2、打印1000以内的最大斐波那契数列
# 使用递归
N=0
def fib1(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fib1(n-1) + fib1(n-2)
while fib1(N) < 1000:
print fib1(N)
N +=1
# 使用递归(优化:算完的不用再算)
N=0
mem = {0:0 , 1:1}
def fib2(n):
if n not in mem:
mem[n] = fib2(n-1) + fib2(n-2)
return mem[n]
while fib2(N) < 1000:
print fib2(N)
N +=1
# 使用了迭代器
def fib3(n):
a, b = 0,1
while a < n:
yield a
a,b = b,a+b
for i in fib3(1000):
print i
3、python实现linux tail -f
[root@saltstack-ui PyTest]# cat tail_f.py
import time
def tail_f(file):
interval = 1
while True:
line = file.readline()
if not line:
time.sleep(interval)
where = file.tell()
file.seek(where)
else:
yield line
for line in tail_f(open('a.txt')):
print line,
4、python实现栈、队列(基于List实现)
class Stack():
def __init__(self):
self.stack = []
def push(self,item):
self.stack.append(item)
def pop(self):
if self.stack != []:
return self.stack.pop(-1)
def top(self):
if self.stack != []:
return self.stack[-1]
else:
return None
def length(self):
return len(self.stack)
class Queue():
def __init__(self):
self.queue = []
def enq(self,item):
self.queue.append(item)
def deq(self):
if self.queue != []:
return self.queue.pop(0)
def head(self):
if self.queue != []:
return self.queue[0]
def tail(self):
if self.queue != []:
return self.queue[-1]
def length(self):
return len(self.queue)
python collections模块提供了deque双向队列数据结构,双向都可以出队列
python实现环形队列,基于一个定长的list实现
class RingQueue:
def __init__(self,capacity):
self.size = 0
self.front = 0
self.end = 0
self.capacity = capacity
self.queue = [0] * capacity
def enq(self,item):
if self.size < self.capacity:
self.size += 1
self.queue[self.end] = item
self.end = (self.end + 1) % self.capacity
else:
print "The queue is full!"
def dep(self):
if self.size > 0:
self.size -= 1
self.queue[self.front] = 0
self.front = (self.front + 1) % self.capacity
else:
print "The queue is empty!"
def get_front(self):
return self.queue[self.front]
if __name__ == '__main__':
ringqueue = RingQueue(3)
ringqueue.enq('1')
print ringqueue.queue
ringqueue.enq('2')
print ringqueue.queue
ringqueue.dep()
print ringqueue.queue
ringqueue.enq('3')
print ringqueue.queue
ringqueue.dep()
print ringqueue.queue
ringqueue.enq('4')
print ringqueue.queue
ringqueue.enq('5')
print ringqueue.queue