本机真实记录 json 自定义序列化的调用顺序:default 只在遇到不认识的对象时触发(本例 3 次:set、User、date),object_hook 由内到外触发;并实测往返丢类型(tuple→list、int 键→str)、NaN 输出非法 JSON、重复键静默覆盖、default 返回自身抛 Circular reference。
本机真实验证:random.seed(42) 两次得到同一串数;观察 random 的 624 个 32 位输出后还原出 Mersenne Twister 完整状态,连续预测出接下来的整数、浮点数和一个 12 位「重置令牌」全部命中,而对 secrets.SystemRandom 同样的攻击命中 0/5;并测得 hashlib 跨进程恒定、内置 hash() 跨进程变化。
本机用自己实现并与 hashlib 对拍通过的 SHA-256,真实对 sha256(secret+message) 做长度扩展攻击:不知道 16 字节密钥就伪造出 role=admin 的合法签名并通过服务端验证;同样方法对 hmac 无效;并测得 == 比较在第 1 字节与最后 1 字节不同时耗时相差约 1.6 万倍(0.04 µs 对 632 µs),compare_digest 恒定。
本机真实暴力枚举 sha256 存储的 6 位数字口令:试了 482916 次,用时 250 ms 就找到;对比 pbkdf2_hmac(60 万次迭代,每次约 64 ms)与 scrypt 的每次耗时,并验证加盐后相同口令不再产生相同哈希。
用 6 个独立子进程真实验证 atexit:回调按注册的相反顺序执行、回调抛异常被打印并忽略且其余回调照常执行、在退出阶段再注册的回调不会执行、非守护线程会先被等完而守护线程被静默丢弃,unregister 会移除同一函数的所有注册。
本机真实建 zip 包放进 sys.path 导入:加载器是 zipimport.zipimporter,导入过程不会往 zip 里写 .pyc;相对 __file__ 打开包内数据文件抛 NotADirectoryError,pkgutil / importlib.resources 可以;zip 里的 .so 被忽略;同一 9000 行模块导入用时:目录 1.42 ms、zip 里放 .py 49.8 ms、zip 里放 .pyc 3.07 ms。
本机真实用 ast 解析源码:括号与注释都不在树里、优先级由树形状表达;统计 json/decoder.py 的 1759 个节点(48 种类型);用 NodeTransformer 把常量都加 1 后重新编译执行得到 39;literal_eval 拒绝函数调用而 eval 直接执行;编译器会常量折叠(2*3+1 直接变成 7)。
本机真实验证 compile 的 eval/exec/single 三种模式,exec 会往传入的字典里塞 __builtins__,在函数里 exec 写的变量读不到;空 __builtins__ 拦得住 print 却拦不住通过 object.__subclasses__() 找回 __import__(实测调用了 os.getpid());eval 字符串 6623 ns 而预编译 code 205 ns。
本机真实用 tokenize 切分源码:一行赋值被切成 8 个 token(含 COMMENT 和 NEWLINE);缩进以 INDENT/DEDENT token 表示;注释在 tokenize 里保留而在 ast 里不存在;f-string 在 3.12+ 被拆成 FSTRING_START/MIDDLE/END;括号内换行是 NL 而不是 NEWLINE;inconsistent 缩进 tokenize 不报错而 compile 报 IndentationError。
本机真实验证:两个对象互相引用后 del,弱引用仍然存活直到 gc.collect() 回收(4 个对象);gc 阈值 (2000, 10, 10);自己用 getrefcount 和 get_referents 实现「试探性删除」,判定的垃圾 [A, B, E] 与 gc.collect() 一致;20 万对环形垃圾在关闭 gc 时占用 70.4 MB,打开时仅 0.10 MB。
本机真实验证 gc.collect() 解决不了的四类内存问题:全局 cache 持有引用时回收 0 个(gc.get_referrers 直接找到持有者);gc.get_objects() 直方图看不到未追踪的 bytearray;回收 199999 个对象后 RSS 只从 280 MB 降到 246 MB;完整回收在 100 万个存活对象时要 12.0 ms,gc.freeze() 后降到 0.001 ms。
本机真实用 -X importtime 记录 python -c pass 启动时最外层导入的 7 个模块(site 一项累计 5434 µs);-S 让启动从 18.8 ms 降到 12.8 ms、模块数 54 → 21;实测用户 site-packages 的 .pth 里的 import 语句和 sitecustomize 会在主脚本之前执行,-I 与 -S 都能关掉它们。