Work around performance issue in vobject library

This commit is contained in:
Raphael Michel
2022-01-24 15:46:48 +01:00
parent c9d3428996
commit 9d6f11718a
2 changed files with 39 additions and 0 deletions

View File

@@ -0,0 +1,35 @@
from datetime import datetime
def monkeypatch_vobject_performance():
"""
This works around a performance issue in the unmaintained vobject library which calls
a very expensive function for every event in a calendar. Since the slow function is
mostly used to compare timezones to UTC, not to arbitrary other timezones, we can
add a few early-out optimizations.
"""
from vobject import icalendar
old_tzinfo_eq = icalendar.tzinfo_eq
test_date = datetime(2000, 1, 1)
def new_tzinfo_eq(tzinfo1, tzinfo2, *args, **kwargs):
if tzinfo1 is None:
return tzinfo2 is None
if tzinfo2 is None:
return tzinfo1 is None
n1 = tzinfo1.tzname(test_date)
n2 = tzinfo2.tzname(test_date)
if n1 == "UTC" and n2 == "UTC":
return True
if n1 == "UTC" or n2 == "UTC":
return False
return old_tzinfo_eq(tzinfo1, tzinfo2, *args, **kwargs)
icalendar.tzinfo_eq = new_tzinfo_eq
def monkeypatch_all_at_ready():
monkeypatch_vobject_performance()