加快路径名的创建

时间:2011-03-13 21:27:14

标签: python performance

我有2个文件夹。第一个(称为A)包含以下形式命名的相同图像:subject_incrementalNumber.jpg(其中incrementalNumber从0到X)。

然后我处理文件夹A中包含的每个图像并从中提取一些片段,然后将每个片段保存在文件夹B中,名称为:subject(与文件夹A中包含的原始图像相同)_incrementalNumber(与文件夹A相同) )_anotherIncrementalNumber(区分一件与另一件)。

最后,我从文件夹A中删除处理过的图像。

A
    subjectA_0.jpg
    subjectA_1.jpg
    subjectA_2.jpg
    ...
    subjectB_0.jpg

B
    subjectA_0_0.jpg
    subjectA_0_1.jpg

    subjectA_1_0.jpg

    subjectA_2_0.jpg
    ...

每次我下载一个主题的新图像并将其保存在文件夹A中时,我必须为该图像计算一个新的路径名(我必须找到特定主题的最小增量编号)。问题是,当我处理图像时,我将其从文件夹A中删除,并且我只存储文件夹B中的文件,因此我必须找到两个文件夹中可用的最小编号。

现在我使用以下函数创建路径名

output_name = chooseName( subject, folderA, folderB )

# Create incremental file
# If the name already exist, try with incremental number (0, 1, etc.)
def chooseName( owner, dest_files, faces_files ):
    # found the min number available in both folders
    v1 = seekVersion_downloaded( owner, dest_files )
    v2 = seekVersion_faces( owner, faces_files )

    # select the max from those 2
    version = max( v1, v2 )

    # create name
    base = dest_files + os.sep + owner + "_"
    fname = base + str(version) + ".jpg"
    return fname


# Seek the min number available in folderA
def seekVersion_folderA( owner, dest_files ):
    def f(x): 
        if fnmatch.fnmatch(x, owner + '_*.jpg'): return x

    res = filter( f, dest_files )

    def g(x): return int(x[x.find("_")+1:-len(".jpg")])
    numbers = map( g, res )

    if len( numbers ) == 0: return 0
    else: return int(max(numbers))+1


# Seek the min number available in folderB
def seekVersion_folderB( owner, faces_files ):
    def f(x): 
        if fnmatch.fnmatch(x, owner + '_*_*.jpg'): return x

    res = filter( f, faces_files )

    def g(x): return int(x[x.find("_")+1:x.rfind("_")])
    numbers = map( g, res )

    if len( numbers ) == 0: return 0
    else: return int(max(numbers))+1

它可以工作,但是每个图像的这个过程大约需要10秒,而且由于我有很多图像,因此效率太低。 有什么办法可以加快速度吗?

2 个答案:

答案 0 :(得分:1)

正如所指出的,这确实是一个没有神奇捷径的难题。为了找到您需要使用试验和错误的最小可用数量,就像您正在做的那样。虽然可以加快实施速度,但算法存在根本性的局限性。

我想我会稍微放松对问题的限制。我会准备选择不是最低数量的数字。我会在目录中存储一个隐藏文件,其中包含创建文件时使用的最后一个数字。每次创建另一个时,从文件中读取此数字,将其递增1,然后查看该名称是否可用。如果是这样你很好,如果没有,从那里开始计数。当你确定姓名时,请记得更新文件。

如果没有人正在阅读这些名称,那么最好使用随机生成的名称。

答案 1 :(得分:0)

我找到了另一种解决方案:将文件的哈希值用作唯一文件名