Added lazy loading when showing grid to improve performance
This commit is contained in:
@@ -1,12 +1,16 @@
|
||||
import ast
|
||||
import base64
|
||||
import cProfile
|
||||
import functools
|
||||
import hashlib
|
||||
import importlib
|
||||
import inspect
|
||||
import pkgutil
|
||||
import re
|
||||
import time
|
||||
import types
|
||||
import uuid
|
||||
from datetime import datetime
|
||||
from enum import Enum
|
||||
from io import BytesIO
|
||||
from urllib.parse import urlparse
|
||||
@@ -420,6 +424,66 @@ def split_host_port(url):
|
||||
return host, port
|
||||
|
||||
|
||||
def timed(func):
|
||||
@functools.wraps(func)
|
||||
def wrapper(*args, **kwargs):
|
||||
start = time.perf_counter()
|
||||
result = func(*args, **kwargs)
|
||||
end = time.perf_counter()
|
||||
|
||||
# get class name
|
||||
class_name = None
|
||||
if args:
|
||||
# check the first argument to see if it's a class'
|
||||
if inspect.isclass(args[0]):
|
||||
class_name = args[0].__name__ # class method
|
||||
elif hasattr(args[0], "__class__"):
|
||||
class_name = args[0].__class__.__name__ # instance method
|
||||
|
||||
if class_name:
|
||||
print(f"[PERF] {class_name}.{func.__name__} took {end - start:.4f} sec")
|
||||
else:
|
||||
print(f"[PERF] {func.__name__} took {end - start:.4f} sec")
|
||||
|
||||
return result
|
||||
|
||||
return wrapper
|
||||
|
||||
|
||||
def profile_function(func):
|
||||
@functools.wraps(func)
|
||||
def wrapper(*args, **kwargs):
|
||||
profiler = cProfile.Profile()
|
||||
try:
|
||||
profiler.enable()
|
||||
result = func(*args, **kwargs)
|
||||
finally:
|
||||
profiler.disable()
|
||||
|
||||
# Determine class name if any
|
||||
class_name = None
|
||||
if args:
|
||||
if inspect.isclass(args[0]):
|
||||
class_name = args[0].__name__ # class method
|
||||
elif hasattr(args[0], "__class__"):
|
||||
class_name = args[0].__class__.__name__ # instance method
|
||||
|
||||
# Compose filename with timestamp
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
||||
if class_name:
|
||||
filename = f"{class_name}_{func.__name__}_{timestamp}.prof"
|
||||
else:
|
||||
filename = f"{func.__name__}_{timestamp}.prof"
|
||||
|
||||
# Dump stats to file
|
||||
profiler.dump_stats(filename)
|
||||
print(f"[PROFILE] Profiling data saved to {filename}")
|
||||
|
||||
return result
|
||||
|
||||
return wrapper
|
||||
|
||||
|
||||
class UnreferencedNamesVisitor(ast.NodeVisitor):
|
||||
"""
|
||||
Try to find symbols that will be requested by the ast
|
||||
@@ -463,5 +527,4 @@ class UnreferencedNamesVisitor(ast.NodeVisitor):
|
||||
:rtype:
|
||||
"""
|
||||
self.names.add(node.arg)
|
||||
self.visit_selected(node, ["value"])
|
||||
|
||||
self.visit_selected(node, ["value"])
|
||||
Reference in New Issue
Block a user