1

私はアバターをサポートする django プロジェクトに取り組んでおり、システム (これは最大ではありませんが、維持する必要があります) では、ユーザーが生成したアバター ファイルに YYYYMMDDHHMM 形式のタイムスタンプを埋め込み、それを user_id と連結する必要があります。例:

23_201308080930.png

これらのファイル名を解析し、最新のタイムスタンプを返す関数を作成しました。

def _get_timestamp(self):
    """Return the timestamp of a user's most recently uploaded avatar."""
    path = settings.USER_AVATAR_DIRECTORY + self._get_dir()
    user_id = self.user_id
    file_re = re.escape(str(user_id)) + r"_\d{12}.png"
    times = []
    [times.append(file) for file in os.listdir(path) if re.match(file_re, file)]
    if times:
        digits = [re.findall("\d{12}", timestamp) for timestamp in times]
        timestamp = sorted(digits, reverse=True)[0][0]
        return timestamp

問題なく動作しますが、順次正規表現によって返されるリスト内のリストをトラバースするために必要な二重の [0][0] ポップは少し不快で、全体的に少し鈍いようです。さらに、アバターは実際には多くのディレクトリに分散していますが (user_id によって自動的に生成されますが、ここではそれほど重要ではありません)、ディレクトリが非常に大きい場合、力ずくの正規表現検索によってパフォーマンスが低下する可能性があると思います。

この問題の最適で慣用的な解決策は何か知りたいですか? ジェネレーターまたは何らかの形式の遅延評価の候補ですか?

4

1 に答える 1

2

これには正規表現を使用しません。本当に必要でないときは避けるのが最善です。これが私がそれを行う方法です(テストされていません):

def _get_timestamp(self):
    """Return the timestamp of a user's most recently uploaded avatar."""
    path = settings.USER_AVATAR_DIRECTORY + self._get_dir()
    filenames = [filename for filename in os.listdir(path)
                 if filename.partition('_')[0] == str(self.user_id)]
    filenames.sort(reverse=True)
    return (filenames[0].rpartition('_')[2].partition('.')[0]
            if filenames else None)
于 2013-08-08T08:50:26.873 に答える