07xx-IO文件读写
读取全部
f.read()
括号里填参表示读取几个字符
按行读取到列表中,每行为一个元素
f.readlines()
同样,括号里的参数决定读取的行数(?
不加s就是只读一行,括号参数决定哪一行(?
这些代码一次读取全部,量大了容易撑爆内存
可以用for item in f来读取,他是用迭代的方式来操作
python内存管理机制
1. 引用技术:每个数据记录着被变量关联的次数
当为0时,数据成为垃圾(被标记清楚时才释放)
缺点:存在循环引用,垃圾数据占用内存的情况
2. 标记清除:全盘扫描内存空间,检测不再使用的数据
缺点:速度很慢
3. 分代挥手:将内存分为012(小中大)三代,
每次在0代创建数据,
当内存告急时触发标记清楚,将有用的数据升代
这个不用你自个干,你能干的是调整这三代的大小,什么时候算告急
但是不建议你干,因为他原本分配的内存就合适,而且你要改需要你有很深的技术造诣
以及你可以做好优化,从根本上减少内存使用
比如for循环,前几个取出来的item虽然引用基数为0,但是垃圾确实产生了,会加快0代内存的清除
减少垃圾产生,对象池
比如
name01 = 'xxx'
name02 = 'xxx'
id(name01) == id(name02) True
创建变量的时候:如果对象池中没有相同数据则开辟空间存储;如果有则直接返回数据地址
提高内存利用率,浮点型,字符串型等等,包括元组,这些不可变数据才有对象池,比如列表等就没有
python3.2之后元组才有的对象池,但是不具备对象池的你可以自己写
所以游戏中打AI,实际上是隐藏了美术模型,然后你去其他地方又打打的是同一拨人,只是模型弄过去数据更新下
要是每个都是单独模型,那对设备的要求非常高,像游戏里的子弹啊,之类的,都是对象池
但是还是该怎么用怎么用,python底层有优化,比如print([]),这个本来应该是没有对象池的
但是如果你Id一些看看就会发现这个也创建了对象池,这些优化在做底层的一些操作的时候很有可能会坏事
比如之前那个多线程的项目,就牵扯到了GIL锁还是哪个,优化给干炸了
(顺带一提,那个是用海龟库画了个界面出来,多线程一边检测光标坐标一边绘制,优化和工作量都很大,吃力不讨好,不如PyQt)
# 这个应该算是个"实时渲染"(

