Sikuwa first commit
Some checks are pending
CI / Test (Python 3.10 on macos-latest) (push) Waiting to run
CI / Test (Python 3.11 on macos-latest) (push) Waiting to run
CI / Test (Python 3.12 on macos-latest) (push) Waiting to run
CI / Test (Python 3.8 on macos-latest) (push) Waiting to run
CI / Test (Python 3.9 on macos-latest) (push) Waiting to run
CI / Test (Python 3.10 on ubuntu-latest) (push) Waiting to run
CI / Test (Python 3.11 on ubuntu-latest) (push) Waiting to run
CI / Test (Python 3.12 on ubuntu-latest) (push) Waiting to run
CI / Test (Python 3.8 on ubuntu-latest) (push) Waiting to run
CI / Test (Python 3.9 on ubuntu-latest) (push) Waiting to run
CI / Test (Python 3.10 on windows-latest) (push) Waiting to run
CI / Test (Python 3.11 on windows-latest) (push) Waiting to run
CI / Test (Python 3.12 on windows-latest) (push) Waiting to run
CI / Test (Python 3.8 on windows-latest) (push) Waiting to run
CI / Test (Python 3.9 on windows-latest) (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Release (push) Blocked by required conditions
Documentation / Build Documentation (push) Waiting to run
Some checks are pending
CI / Test (Python 3.10 on macos-latest) (push) Waiting to run
CI / Test (Python 3.11 on macos-latest) (push) Waiting to run
CI / Test (Python 3.12 on macos-latest) (push) Waiting to run
CI / Test (Python 3.8 on macos-latest) (push) Waiting to run
CI / Test (Python 3.9 on macos-latest) (push) Waiting to run
CI / Test (Python 3.10 on ubuntu-latest) (push) Waiting to run
CI / Test (Python 3.11 on ubuntu-latest) (push) Waiting to run
CI / Test (Python 3.12 on ubuntu-latest) (push) Waiting to run
CI / Test (Python 3.8 on ubuntu-latest) (push) Waiting to run
CI / Test (Python 3.9 on ubuntu-latest) (push) Waiting to run
CI / Test (Python 3.10 on windows-latest) (push) Waiting to run
CI / Test (Python 3.11 on windows-latest) (push) Waiting to run
CI / Test (Python 3.12 on windows-latest) (push) Waiting to run
CI / Test (Python 3.8 on windows-latest) (push) Waiting to run
CI / Test (Python 3.9 on windows-latest) (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Release (push) Blocked by required conditions
Documentation / Build Documentation (push) Waiting to run
This commit is contained in:
241
cpp_cache/__init__.py
Normal file
241
cpp_cache/__init__.py
Normal file
@@ -0,0 +1,241 @@
|
||||
# sikuwa/cpp_cache/__init__.py
|
||||
# Python包装器模块,用于使用C++实现的智能缓存系统
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import hashlib
|
||||
from pathlib import Path
|
||||
|
||||
# 尝试导入C++扩展模块
|
||||
try:
|
||||
from .pysmartcache import (
|
||||
lru_cache_new,
|
||||
lru_cache_contains,
|
||||
lru_cache_put,
|
||||
lru_cache_get,
|
||||
lru_cache_remove,
|
||||
lru_cache_clear
|
||||
)
|
||||
cpp_extension_loaded = True
|
||||
except ImportError as e:
|
||||
print(f"Warning: pysmartcache C++ extension not found. Using fallback implementation. Error: {e}")
|
||||
cpp_extension_loaded = False
|
||||
|
||||
# Python回退实现
|
||||
if not cpp_extension_loaded:
|
||||
class FallbackLRUCache:
|
||||
"""纯Python实现的LRU缓存"""
|
||||
|
||||
def __init__(self, max_size=1000):
|
||||
self.max_size = max_size
|
||||
self.cache = {}
|
||||
self.usage_order = []
|
||||
|
||||
def contains(self, key):
|
||||
return key in self.cache
|
||||
|
||||
def put(self, key, value):
|
||||
if key in self.cache:
|
||||
# 移动到最近使用
|
||||
self.usage_order.remove(key)
|
||||
elif len(self.cache) >= self.max_size:
|
||||
# 移除最久未使用的
|
||||
oldest = self.usage_order.pop(0)
|
||||
del self.cache[oldest]
|
||||
|
||||
self.cache[key] = value
|
||||
self.usage_order.append(key)
|
||||
return True
|
||||
|
||||
def get(self, key):
|
||||
if key not in self.cache:
|
||||
return ""
|
||||
|
||||
# 移动到最近使用
|
||||
self.usage_order.remove(key)
|
||||
self.usage_order.append(key)
|
||||
return self.cache[key]
|
||||
|
||||
def remove(self, key):
|
||||
if key in self.cache:
|
||||
del self.cache[key]
|
||||
self.usage_order.remove(key)
|
||||
return True
|
||||
return False
|
||||
|
||||
def clear(self):
|
||||
self.cache.clear()
|
||||
self.usage_order.clear()
|
||||
return True
|
||||
|
||||
# 模拟C++扩展的函数
|
||||
def lru_cache_new(max_size=1000):
|
||||
return FallbackLRUCache(max_size)
|
||||
|
||||
def lru_cache_contains(cache, key):
|
||||
return cache.contains(key)
|
||||
|
||||
def lru_cache_put(cache, key, value):
|
||||
return cache.put(key, value)
|
||||
|
||||
def lru_cache_get(cache, key):
|
||||
return cache.get(key)
|
||||
|
||||
def lru_cache_remove(cache, key):
|
||||
return cache.remove(key)
|
||||
|
||||
def lru_cache_clear(cache):
|
||||
return cache.clear()
|
||||
|
||||
# LRUCache类的Python包装器
|
||||
class LRUCache:
|
||||
"""LRU (Least Recently Used) 缓存的Python包装器"""
|
||||
|
||||
def __init__(self, max_size=1000):
|
||||
"""创建一个新的LRU缓存"""
|
||||
self.cache = lru_cache_new(max_size)
|
||||
|
||||
def contains(self, key):
|
||||
"""检查缓存中是否包含指定的键"""
|
||||
return lru_cache_contains(self.cache, key)
|
||||
|
||||
def put(self, key, value):
|
||||
"""将键值对放入缓存"""
|
||||
return lru_cache_put(self.cache, key, value)
|
||||
|
||||
def get(self, key):
|
||||
"""从缓存中获取指定键的值"""
|
||||
return lru_cache_get(self.cache, key)
|
||||
|
||||
def remove(self, key):
|
||||
"""从缓存中移除指定的键"""
|
||||
return lru_cache_remove(self.cache, key)
|
||||
|
||||
def clear(self):
|
||||
"""清空缓存"""
|
||||
lru_cache_clear(self.cache)
|
||||
|
||||
# 纯Python实现的BuildCache
|
||||
class BuildCache:
|
||||
"""构建缓存系统"""
|
||||
|
||||
def __init__(self, cache_dir=".cache", max_size=1000000000):
|
||||
"""创建一个新的构建缓存"""
|
||||
self.cache_dir = Path(cache_dir)
|
||||
self.cache_dir.mkdir(parents=True, exist_ok=True)
|
||||
self.max_size = max_size
|
||||
self.cache_file = self.cache_dir / "build_cache.json"
|
||||
self.cache = self._load_cache()
|
||||
|
||||
def _load_cache(self):
|
||||
"""从文件加载缓存"""
|
||||
if self.cache_file.exists():
|
||||
try:
|
||||
with open(self.cache_file, 'r', encoding='utf-8') as f:
|
||||
return json.load(f)
|
||||
except Exception:
|
||||
pass
|
||||
return {}
|
||||
|
||||
def _save_cache(self):
|
||||
"""保存缓存到文件"""
|
||||
try:
|
||||
with open(self.cache_file, 'w', encoding='utf-8') as f:
|
||||
json.dump(self.cache, f, indent=2, ensure_ascii=False)
|
||||
except Exception as e:
|
||||
print(f"Error saving cache: {e}")
|
||||
|
||||
def set_cache_strategy(self, strategy):
|
||||
"""设置缓存策略 ("lru" 或 "lfu")"""
|
||||
# Python实现不支持策略切换,这里只是为了兼容接口
|
||||
pass
|
||||
|
||||
def cache_build_result(self, target, command, dependencies, result):
|
||||
"""缓存构建结果"""
|
||||
cache_key = self._generate_cache_key(target, command, dependencies)
|
||||
self.cache[cache_key] = {
|
||||
"result": result,
|
||||
"dependencies": dependencies,
|
||||
"command": command,
|
||||
"timestamp": os.path.getmtime(__file__)
|
||||
}
|
||||
self._save_cache()
|
||||
return True
|
||||
|
||||
def get_cached_build_result(self, target, command, dependencies):
|
||||
"""获取缓存的构建结果"""
|
||||
cache_key = self._generate_cache_key(target, command, dependencies)
|
||||
if cache_key in self.cache:
|
||||
return self.cache[cache_key]["result"]
|
||||
return ""
|
||||
|
||||
def needs_rebuild(self, target, command, dependencies):
|
||||
"""检查是否需要重新构建"""
|
||||
cache_key = self._generate_cache_key(target, command, dependencies)
|
||||
if cache_key not in self.cache:
|
||||
return True
|
||||
|
||||
# 这里简单地总是返回False,因为我们已经生成了包含所有依赖的缓存键
|
||||
# 在实际实现中,可以检查依赖文件是否有变化
|
||||
return False
|
||||
|
||||
def _generate_cache_key(self, target, command, dependencies):
|
||||
"""生成缓存键"""
|
||||
# 合并所有信息生成唯一的缓存键
|
||||
all_info = f"{target}|{command}|{json.dumps(dependencies, sort_keys=True)}"
|
||||
return hashlib.sha256(all_info.encode()).hexdigest()
|
||||
|
||||
def clean_all_cache(self):
|
||||
"""清理所有缓存"""
|
||||
self.cache.clear()
|
||||
self._save_cache()
|
||||
return True
|
||||
|
||||
def dump_stats(self):
|
||||
"""打印缓存统计信息"""
|
||||
print(f"Build Cache Statistics:")
|
||||
print(f" Cache directory: {self.cache_dir}")
|
||||
print(f" Number of cached items: {len(self.cache)}")
|
||||
|
||||
# 为BuildCache创建类似C++扩展的函数接口
|
||||
def build_cache_new(cache_dir=".cache", max_size=1000000000):
|
||||
return BuildCache(cache_dir, max_size)
|
||||
|
||||
def build_cache_set_cache_strategy(cache, strategy):
|
||||
return cache.set_cache_strategy(strategy)
|
||||
|
||||
def build_cache_cache_build_result(cache, target, command, dependencies, result):
|
||||
# 如果dependencies是字符串,将其转换为列表
|
||||
if isinstance(dependencies, str):
|
||||
dependencies = [dependencies]
|
||||
return cache.cache_build_result(target, command, dependencies, result)
|
||||
|
||||
def build_cache_get_cached_build_result(cache, target, command, dependencies):
|
||||
# 如果dependencies是字符串,将其转换为列表
|
||||
if isinstance(dependencies, str):
|
||||
dependencies = [dependencies]
|
||||
return cache.get_cached_build_result(target, command, dependencies)
|
||||
|
||||
def build_cache_needs_rebuild(cache, target, command, dependencies):
|
||||
# 如果dependencies是字符串,将其转换为列表
|
||||
if isinstance(dependencies, str):
|
||||
dependencies = [dependencies]
|
||||
return cache.needs_rebuild(target, command, dependencies)
|
||||
|
||||
def build_cache_clean_all_cache(cache):
|
||||
return cache.clean_all_cache()
|
||||
|
||||
def build_cache_dump_build_cache_stats(cache):
|
||||
return cache.dump_stats()
|
||||
|
||||
# 导出所有函数
|
||||
globals().update({
|
||||
'build_cache_new': build_cache_new,
|
||||
'build_cache_set_cache_strategy': build_cache_set_cache_strategy,
|
||||
'build_cache_cache_build_result': build_cache_cache_build_result,
|
||||
'build_cache_get_cached_build_result': build_cache_get_cached_build_result,
|
||||
'build_cache_needs_rebuild': build_cache_needs_rebuild,
|
||||
'build_cache_clean_all_cache': build_cache_clean_all_cache,
|
||||
'build_cache_dump_build_cache_stats': build_cache_dump_build_cache_stats
|
||||
})
|
||||
Reference in New Issue
Block a user