我想知道什么是更快更好的:
class AvgRGB(object):
def __init__(self, path):
self.path = path
self.imgs = []
self.avg = MyRGBImg()
def gather_pictures(self):
# for now gathe all the files, next check for picture extensions
p = self.path
self.names = [f for f in listdir(p) if isfile(join(p, f))]
for imgname in self.names:
path, name, ext = get_pathname(imgname)
if ext in ['.png', '.jpg']:
imagepath = join(self.path, imgname)
img = MyRGBImg(imagepath )
self.imgs.append(img)
def average(self):
dataset = self.imgs
s = MyRGBImg(np.zeros(dataset[0].data.shape))
for i, picture in enumerate(dataset):
im = picture.data
s += im
s = s / float(len(dataset))
self.avg = MyRGBImg(s)
或
class AvgRGB_savememory(object):
def __init__(self, path):
self.path = path
self.imgs_names = []
def get_image(self, index):
# read the image corresponding to the path
pathtopic = join(self.path, self.imgs_names[index])
myimg = MyRGBImg()
myimg.read_from_file(pathtopic)
return myimg
def gather_pictures_names(self):
p = self.path
filenames = [f for f in listdir(p) if isfile(join(p, f))]
for filename in filenames:
path, name, ext = get_pathname(filename)
if ext in ['.png', '.jpg']:
self.imgs_names.append(filename)
def average(self, aligned = True, debug = False):
sizedataset = len(self.imgs_names)
picture = self.get_image(0)
s = MyRGBImg(np.zeros(picture.data.shape))
for i in range(sizedataset):
#load the picture
picture = self.get_image(i)
im = picture.data
#perform operations
s += im
s = s / float(sizedataset)
self.avg = MyRGBImg(s)
这段代码从文件夹中获取图像并对其进行平均。
两个snipplet之间的区别在于:第一个将图像加载到数组中,而第二个从内存加载图片。
现在您必须想象这不是我唯一的操作,当我尝试分析500张图片(1080x1080x3)中的数据时,程序会出现内存错误。
我的问题是哪个更好?还是更快?
理论上第一个应该更快,因为加载内存中的所有图像,但是当数组的大小大于RAM时会发生什么?他们写在磁盘上?如果那不是那么慢,只是阅读单个图像? 考虑到我的所有程序都是顺序的,那么从缓冲区流式传输图片会更有效吗?
答案 0 :(得分:0)
我没有你的样本数据,但我会使用一些虚拟函数和arg。您可以通过调用找出给定函数调用的实际成本,如下所示:
your_function = lambda x: enumerate(range(x, x**x))
your_arg1 = 8
import cProfile
import pstats
prof = cProfile.Profile()
group = prof.runcall(your_function, your_arg1)
p = pstats.Stats(prof)
p.sort_stats('time').print_stats(100)
这将打印出例如:
3 function calls in 0.600 seconds
Ordered by: internal time
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.600 0.600 0.600 0.600 {range}
1 0.000 0.000 0.600 0.600 python.py:1(<lambda>)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
答案 1 :(得分:0)
根据建议我做了一些自制的分析
我用这个自己实现的计时功能
https://pastebin.com/Myph3ndJ
以下是两个经过测试的函数AvgFolder
和AvgFolderMem
,第一个将所有图像加载到内存中,而第二个函数在需要时从磁盘加载图像。以下是执行
https://github.com/Pella86/DenoiseAverage/blob/master/src/AvgFolder_class.py
这些结果总结如下: https://pastebin.com/pcHZFVLV
5张图片128x128(灰度)
--------LOAD IN MEM 5---------
Total elapsed time: 00:00:05
305 us/px
--------MEMSAVE 5---------
Total elapsed time: 00:00:06
366 us/px
20张图片128x128(灰度)
--------LOAD IN MEM 20---------
Total elapsed time: 00:00:20
1220 us/px
--------MEMSAVE 20 ---------
Total elapsed time: 00:00:20
1220 us/px
100张图片128x128(灰度)
--------LOAD IN MEM 100---------
Total elapsed time: 00:01:37
5920 us/px
--------MEMSAVE 100---------
Total elapsed time: 00:01:46
6469 us/px
20张图片512x512(灰度)
--------LOAD IN MEM---------
Total elapsed time: 00:27:26
100'463 us/px
--------MEMSAVE---------
Total elapsed time: 00:27:40
101'310 us/px
因此,与教科书概念相反,使用numpy从磁盘内存中上下加载文件非常有效。 我不知道是因为图像进入分页问题还是因为我的RAM充满了垃圾。