我一直在研究一个涉及从文件中将相对较大的字典加载到内存中的项目.字典的条目不到200万条,每个条目(键和值组合)不到20个字节.磁盘上文件的大小为38 MB.
我的问题是,当我尝试加载字典时,我的程序立即扩展到超过2.5千兆字节的内存使用.
这是我用来从磁盘读取字典的代码:
f = open('someFile.txt', 'r')
rT = eval(f.read())
f.close()
Run Code Online (Sandbox Code Playgroud) 我想问一下如何检索出fibo列表列表,然后检查用户的输入值是否在fibo列表中.
a , b = 1, 1
while num <= sys.maxint:
fibo == a , b = b, a+b
if num == (b +a+b):
print "It is a Fibonacci number"
break
else:
print "It is not a Fibonacci number"
break
Run Code Online (Sandbox Code Playgroud)
谢谢!
想象一下,我们有一段代码可以将大数据切割成更小的数据并对其进行一些处理.
def node_cut(input_file):
NODE_LENGTH = 500
count_output = 0
node_list=[]
for line in input_file.readlines():
if len(node_list) >= NODE_LENGTH :
count_output += 1
return( node_list,count_output )
node_list=[]
node,t=line.split(',')
node_list.append(node)
if __name__ =='__main__':
input_data = open('all_nodes.txt','r')
node_list, count_output = node_cut(input_data)
some_process(node_list)
Run Code Online (Sandbox Code Playgroud)
当node_cut返回第一个数据列表时,for循环停止继续执行其余的大数据.我如何确保它返回但仍然循环继续?
yield和return用示例解释有什么区别?当我们在生成器中有yield任何值或请求时,实际发生了什么?
我没有从任何其他函数或程序调用生成器。
我的循环是:
for index in range(3):
yield Request(url,callback=parse)
Run Code Online (Sandbox Code Playgroud)
这是在特定网址上发出请求,并在请求后调用回调函数。这段代码在做什么?
代码遵循的顺序是什么?
下面是一个简单的功能,可以在保留顺序的同时删除列表中的重复项.我已经尝试过了,它确实有效,所以这里的问题是我的理解.在我看来,第二次运行uniq.remove(item)给定项目时,它将返回错误(KeyError或者ValueError我认为?),因为该项目已从唯一集合中删除.这不是这种情况吗?
def unique(seq):
uniq = set(seq)
return [item for item in seq if item in uniq and not uniq.remove(item)]
Run Code Online (Sandbox Code Playgroud) 我正在编写康威的生命游戏实现。我的第一次尝试只是在每次更新后在 1 和 0 的 NxN 板上使用 matplotlib 的 imshow 绘制板。但是,这不起作用,因为程序在显示情节时会暂停。您必须关闭绘图才能进行下一次循环迭代。
我发现 matplotlib 中有一个动画包,但它不接受(或给出)变量,所以我见过的每个实现(甚至matplotlib 的文档)都依赖于全局变量。
所以这里有两个问题:
1)这是一个可以使用全局变量的地方吗?我一直读到这从来都不是一个好主意,但这只是教条吗?
2)你将如何在没有全局变量的情况下在 python 中做这样的动画(即使这意味着放弃 matplotlib,我猜;标准库总是首选)。
玩弄树木,我偶然发现了这种行为:
def descendants (self):
return #or "pass" or "42"
Run Code Online (Sandbox Code Playgroud)
明显回归None.
另一方面:
def descendants (self):
return
yield 42
Run Code Online (Sandbox Code Playgroud)
返回一个不产生任何东西的生成器(实际上是叶节点所需的行为).
有人可以向我解释一下这里发生了什么吗?
不应该yield 42是无法访问的代码吗?(我猜测函数是生成器还是"普通"函数的决定是在编译时根据它是否包含一个或多个yield语句来做出的,无论它们是否可达.但这只是一个黑暗的镜头.)
上下文如下:我有树,每个节点都是树或叶子.现在我想生成一个节点的所有后代:
class Leaf (Node):
@property
def descendants (self):
return
yield 42
class Tree (Node):
@property
def descendants (self):
for child in self.children:
yield child
yield from child.descendants
Run Code Online (Sandbox Code Playgroud) 简要说明:
我有一个Scrapy项目,该项目从Yahoo!获取库存数据。金融。为了使我的项目正常工作,我需要确保库存已到期望的时间。为此,我首先取消CAT(Caterpillar Inc.(CAT)-NYSE),获取该时间段的收盘价,然后确保所有在此之后报废的股票具有与CAT相同的收盘价。 ,从而确保已将股票公开交易了所需的时间长度。
问题:
这一切都很好,但我的问题是,在scrapy完成CAT解析之前,它开始刮除其他股票并进行解析。这导致出现错误,因为在我可以从CAT获得所需的收盘价之前,scrapy试图确定是否有其他股票具有与CAT相同的收盘价,而这还不存在。
实际问题
我该如何强制scrapy在开始其他网址之前先完成对其中一个网址的解析
我也尝试过:
def start_requests(self):
global start_time
yield Request('http://finance.yahoo.com/q?s=CAT', self.parse)
# Waits 4 seconds to allow CAT to finish crawling
if time.time() - start_time > 0.2:
for i in self.other_urls:
yield Request(i, self.parse)
Run Code Online (Sandbox Code Playgroud)
但other_urls进货从未开始,因为刮y永远不会回到def start_requests检查时间是否已到0.2
整个代码:
from scrapy.selector import Selector
from scrapy import Request
from scrapy.exceptions import CloseSpider
from sharpeparser.gen_settings import *
from decimal import Decimal
from scrapy.spider import Spider
from sharpeparser.items import SharpeparserItem
import numpy
import time
if …Run Code Online (Sandbox Code Playgroud) 在Python中增加全局变量的优雅方法:
这是我到目前为止的内容:
my_i = -1
def get_next_i():
global my_i
my_i += 1
return my_i
Run Code Online (Sandbox Code Playgroud)
使用发电机:
my_iter = iter(range(100000000))
def get_next_i():
return next(my_iter)
Run Code Online (Sandbox Code Playgroud)
与班级:
class MyI:
MyI.my_i = -1
@staticmethod
def next():
MyI.my_i += 1
return MyI.my_i
Run Code Online (Sandbox Code Playgroud)
最好的替代方法是什么?
这些功能的目的是为代码中的特定事件分配唯一的编号。该代码不仅是一个循环,因此
for i in range(...):在这里不适合使用。更高版本可能会使用分配给不同事件的多个索引。第一个代码将需要重复来解决此问题。(get_next_i(),get_next_j(),...)
谢谢。
什么是像 python 那样做 yield(和 yield from)的 julian 方法?
编辑:我会尝试在 python 中添加小例子。
想想 4x4 国际象棋棋盘。找到棋王可以做的每N步长路径。不要浪费内存-> 生成每条路径。
如果我们用数字签署每个职位:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 16
Run Code Online (Sandbox Code Playgroud)
点 0 有 3 个邻居(1、4、5)。我们可以为每个点找到每个邻居的表格:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 16
Run Code Online (Sandbox Code Playgroud)
递归函数(生成器)从点列表或(...的生成器)点的生成器放大给定路径:
NEIG = [[1, 4, 5], [0, 2, 4, 5, 6], [1, 3, 5, 6, 7], [2, 6, 7], [0, 1, 5, 8, 9], [0, …Run Code Online (Sandbox Code Playgroud) python ×9
generator ×2
scrapy ×2
animation ×1
dictionary ×1
for-loop ×1
graphics ×1
iterator ×1
julia ×1
matplotlib ×1
memory ×1
python-3.x ×1
scipy ×1