[tor-commits] [stem/master] Caching parsed tor versions

atagar at torproject.org atagar at torproject.org
Tue Oct 8 07:50:17 UTC 2013


commit 2ce003ef33c8693234f7dce562fdd3cff4e37e07
Author: Damian Johnson <atagar at torproject.org>
Date:   Tue Oct 8 00:15:51 2013 -0700

    Caching parsed tor versions
    
    Reusing parsed tor versions saves us an impressive 3.7% memory usage without
    any noticable impact on parsing times.
---
 stem/descriptor/networkstatus.py       |    2 +-
 stem/descriptor/router_status_entry.py |    2 +-
 stem/descriptor/server_descriptor.py   |    2 +-
 stem/version.py                        |   11 +++++++++++
 4 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/stem/descriptor/networkstatus.py b/stem/descriptor/networkstatus.py
index 8d615fa..a2b07fb 100644
--- a/stem/descriptor/networkstatus.py
+++ b/stem/descriptor/networkstatus.py
@@ -712,7 +712,7 @@ class _DocumentHeader(object):
       elif keyword in ("client-versions", "server-versions"):
         for entry in value.split(","):
           try:
-            version_value = stem.version.Version(entry)
+            version_value = stem.version._get_version(entry)
 
             if keyword == 'client-versions':
               self.client_versions.append(version_value)
diff --git a/stem/descriptor/router_status_entry.py b/stem/descriptor/router_status_entry.py
index 733a066..4018b22 100644
--- a/stem/descriptor/router_status_entry.py
+++ b/stem/descriptor/router_status_entry.py
@@ -584,7 +584,7 @@ def _parse_v_line(desc, value, validate):
 
   if value.startswith("Tor "):
     try:
-      desc.version = stem.version.Version(value[4:])
+      desc.version = stem.version._get_version(value[4:])
     except ValueError as exc:
       if validate:
         raise ValueError("%s has a malformed tor version (%s): v %s" % (desc._name(), exc, value))
diff --git a/stem/descriptor/server_descriptor.py b/stem/descriptor/server_descriptor.py
index 521d07a..8d11801 100644
--- a/stem/descriptor/server_descriptor.py
+++ b/stem/descriptor/server_descriptor.py
@@ -442,7 +442,7 @@ class ServerDescriptor(Descriptor):
           version_str, self.operating_system = platform_match.groups()
 
           try:
-            self.tor_version = stem.version.Version(version_str)
+            self.tor_version = stem.version._get_version(version_str)
           except ValueError:
             pass
       elif keyword == "published":
diff --git a/stem/version.py b/stem/version.py
index b529f86..68faa36 100644
--- a/stem/version.py
+++ b/stem/version.py
@@ -62,6 +62,12 @@ import re
 import stem.util.enum
 import stem.util.system
 
+try:
+  # added in python 3.2
+  from collections import lru_cache
+except ImportError:
+  from stem.util.lru_cache import lru_cache
+
 # cache for the get_system_tor_version function
 VERSION_CACHE = {}
 
@@ -115,6 +121,11 @@ def get_system_tor_version(tor_cmd = "tor"):
   return VERSION_CACHE[tor_cmd]
 
 
+ at lru_cache()
+def _get_version(version_str):
+  return Version(version_str)
+
+
 class Version(object):
   """
   Comparable tor version. These are constructed from strings that conform to





More information about the tor-commits mailing list