Optimize Model insertions (blist + bisect)
This commit is contained in:
		| @@ -9,5 +9,6 @@ lxml           >= 4.4.2, < 5 | |||||||
| mistune        >= 0.8.4, < 0.9 | mistune        >= 0.8.4, < 0.9 | ||||||
| dataclasses    >= 0.6,   < 0.7; python_version < "3.7" | dataclasses    >= 0.6,   < 0.7; python_version < "3.7" | ||||||
| pyfastcopy     >= 1.0.3, < 2;   python_version < "3.8" | pyfastcopy     >= 1.0.3, < 2;   python_version < "3.8" | ||||||
|  | blist          >= 1.3.6, < 2 | ||||||
|  |  | ||||||
| git+http://github.com/mirukan/matrix-nio#egg=matrix-nio[e2e] | git+http://github.com/mirukan/matrix-nio#egg=matrix-nio[e2e] | ||||||
|   | |||||||
| @@ -1,8 +1,11 @@ | |||||||
| # SPDX-License-Identifier: LGPL-3.0-or-later | # SPDX-License-Identifier: LGPL-3.0-or-later | ||||||
|  |  | ||||||
| from threading import Lock | from bisect import bisect | ||||||
|  | from threading import RLock | ||||||
| from typing import TYPE_CHECKING, Any, Dict, Iterator, List, MutableMapping | from typing import TYPE_CHECKING, Any, Dict, Iterator, List, MutableMapping | ||||||
|  |  | ||||||
|  | from blist import blist | ||||||
|  |  | ||||||
| from ..pyotherside_events import ( | from ..pyotherside_events import ( | ||||||
|     ModelCleared, ModelItemDeleted, ModelItemInserted, |     ModelCleared, ModelItemDeleted, ModelItemInserted, | ||||||
| ) | ) | ||||||
| @@ -34,8 +37,8 @@ class Model(MutableMapping): | |||||||
|     def __init__(self, sync_id: SyncId) -> None: |     def __init__(self, sync_id: SyncId) -> None: | ||||||
|         self.sync_id:      SyncId                 = sync_id |         self.sync_id:      SyncId                 = sync_id | ||||||
|         self._data:        Dict[Any, "ModelItem"] = {} |         self._data:        Dict[Any, "ModelItem"] = {} | ||||||
|         self._sorted_data: List["ModelItem"]      = [] |         self._sorted_data: List["ModelItem"]      = blist() | ||||||
|         self._write_lock:  Lock                   = Lock() |         self._write_lock:  RLock                  = RLock() | ||||||
|  |  | ||||||
|  |  | ||||||
|     def __repr__(self) -> str: |     def __repr__(self) -> str: | ||||||
| @@ -85,10 +88,10 @@ class Model(MutableMapping): | |||||||
|             new.parent_model = self |             new.parent_model = self | ||||||
|  |  | ||||||
|             self._data[key] = new |             self._data[key] = new | ||||||
|             self._sorted_data.append(new) |             index           = bisect(self._sorted_data, new) | ||||||
|             self._sorted_data.sort() |             self._sorted_data.insert(index, new) | ||||||
|  |  | ||||||
|             ModelItemInserted(self.sync_id, self._sorted_data.index(new), new) |             ModelItemInserted(self.sync_id, index, new) | ||||||
|  |  | ||||||
|  |  | ||||||
|     def __delitem__(self, key) -> None: |     def __delitem__(self, key) -> None: | ||||||
|   | |||||||
| @@ -35,15 +35,16 @@ class ModelItem: | |||||||
|         if getattr(self, name) == value: |         if getattr(self, name) == value: | ||||||
|             return |             return | ||||||
|  |  | ||||||
|         super().__setattr__(name, value) |         with self.parent_model._write_lock: | ||||||
|  |             super().__setattr__(name, value) | ||||||
|  |  | ||||||
|         old_index = self.parent_model._sorted_data.index(self) |             old_index = self.parent_model._sorted_data.index(self) | ||||||
|         self.parent_model._sorted_data.sort() |             self.parent_model._sorted_data.sort() | ||||||
|         new_index = self.parent_model._sorted_data.index(self) |             new_index = self.parent_model._sorted_data.index(self) | ||||||
|  |  | ||||||
|         ModelItemFieldChanged( |             ModelItemFieldChanged( | ||||||
|             self.parent_model.sync_id, old_index, new_index, name, value, |                 self.parent_model.sync_id, old_index, new_index, name, value, | ||||||
|         ) |             ) | ||||||
|  |  | ||||||
|  |  | ||||||
|     def __delattr__(self, name: str) -> None: |     def __delattr__(self, name: str) -> None: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	