我查看了几个SO-Questions,了解如何挑选python对象并将其存储到数据库中.我收集的信息是:
import pickle或import cpickle.如果性能有问题,请导入后者.dict是一个Python字典(或什么那么Python对象)pickled = pickle.dumps(dict).pickled使用什么模块与数据库进行通信,存储到MySQL BLOB列中.pickle.loads(pickled)恢复python字典.我只是想确保我明白这一点.我错过了一些关键的东西吗 有副作用吗?这真的很容易吗?
背景信息:我唯一想做的就是存储Googlegeocoder-Responses,在我的例子中是嵌套的python dictionarys.我只使用响应对象的一小部分,我不知道以后是否需要更多的响应对象.这就是为什么我想存储响应以节省我重复几百万个查询的原因.
我有一个在Ubuntu上运行的python脚本并处理MySQL数据库的内容.当脚本遇到未处理exception或处理完成时,我希望得到通知.
实现这一目标的恰当方法是什么?
我想在使用本SO-Answer中显示的方法从python中发送自己的电子邮件,但为了能够做到这一点,我必须硬编码我的logindata - 我不熟悉(脚本在公共服务器上运行)公司).
是否有任何建议绕过这个或使用更合适的方式实现它?
手册页指出签名sscanf是
sscanf(const char *restrict s, const char *restrict format, ...);
Run Code Online (Sandbox Code Playgroud)
我在SO上看到了一个答案,其中一个函数sscanf用于检查输入是否为整数.
bool is_int(char const* s) {
int n;
int i;
return sscanf(s, "%d %n", &i, &n) == 1 && !s[n];
}
Run Code Online (Sandbox Code Playgroud)
看着!s[n]它似乎建议我们检查是否sscanf扫描了字符序列,直到终止字符\0.所以我假设n代表索引,s当函数结束时sscanf将在字符串中.
但是这个变量i怎么样?这是什么意思?
编辑:
更明确一点:我看到签名需要sscanf一个类型的指针char *作为第一个参数.格式说明符作为seconf参数,因此它知道如何解析字符序列以及与下一个参数一样多的转换说明符变量.我现在明白这i是为了保存解析的整数.
由于只有一个格式说明符,我试图推断出函数n.
我的假设是n正确的吗?
我正在遵循Django Book中的步骤,并进入作者解释热点的部分,设置一个django项目来使用数据库.我选择了mysql.
我的设置settings.py是:
DATABASES = {
'default': {
'ENGINE': 'mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': 'mydatabase', # Or path to database file if using sqlite3.
'USER': 'myname', # Not used with sqlite3.
'PASSWORD': 'mypassword', # Not used with sqlite3.
'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
'PORT': '', # Set to empty string for default. Not used with sqlite3.
}
}
Run Code Online (Sandbox Code Playgroud)
尝试启动服务器时,将打印以下消息:
Validating models...
Traceback (most recent …Run Code Online (Sandbox Code Playgroud) 我有一个class像这样的测试用例:
import unittest
import sys
class Test(unittest.TestCase):
def test_a(self):
pass
def test_b(self):
pass
# etc
if __name__ == "__main__":
unittest.main(verbosity=2)
Run Code Online (Sandbox Code Playgroud)
这是使用PyDev的eclipse文件.我把它作为unittest运行.不知何故,详细程度选项不会触发.没有错误.我错过了什么?
在解释器中,您只需a = [1, 2, 3, u"hellö"]在解释器提示符处写入对象的名称,例如列表,如下所示:
>>> a
[1, 2, 3, u'hell\xf6']
Run Code Online (Sandbox Code Playgroud)
或者你可以这样做:
>>> print a
[1, 2, 3, u'hell\xf6']
Run Code Online (Sandbox Code Playgroud)
这似乎相当于列表.目前我正在使用hdf5来管理一些数据,我意识到上面提到的两种方法之间存在差异.鉴于:
with tables.openFile("tutorial.h5", mode = "w", title = "Some Title") as h5file:
group = h5file.createGroup("/", 'node', 'Node information')
tables.table = h5file.createTable(group, 'readout', Node, "Readout example")
Run Code Online (Sandbox Code Playgroud)
的输出
print h5file
Run Code Online (Sandbox Code Playgroud)
不同于
>>> h5file
Run Code Online (Sandbox Code Playgroud)
所以我想知道是否有人可以解释Python在这两种情况下的行为差异?
如果你想计算矩阵(elementise)的每个条目的正弦,那么在numpy中
a = numpy.arange(0,27,3).reshape(3,3)
numpy.sin(a)
Run Code Online (Sandbox Code Playgroud)
将完成工作!如果你想要电源让我们说每个条目2
a**2
Run Code Online (Sandbox Code Playgroud)
会做的.
但是,如果你有一个稀疏矩阵,事情似乎更难.至少我还没有找到一种方法来做到这一点,除了遍历lil_matrix格式的每个条目并对其进行操作.
我在SO上发现了这个问题,并尝试调整这个答案,但我没有成功.
目标是以元素方式计算CSR格式的scipy.sparse矩阵的平方根(或1/2的幂).
你会建议什么?
我对这个python代码感到头疼.
print "length:", len(pub) # length: 420
pub_dict = dict((p.key, p) for p in pub)
print "dict:", len(pub_dict) # length: 163
Run Code Online (Sandbox Code Playgroud)
如果我理解这一点,我会得到一个字典,其中包含属性p.key作为键,对象p作为其每个元素的值pub.我有没有看到一些副作用?因为len(pub_dict)应该是相同的len(pub),它肯定不在这里,或者我错了?
我有一个main()处理大量数据的简单函数。由于我有一台带有大量内存的 8 核机器,我建议使用multiprocessingpython 模块来加速处理。每个子流程大约需要 18 小时才能完成。
长话短说,我怀疑我multiprocessing是否正确理解了模块的行为。
我以某种方式启动不同的子流程,如下所示:
def main():
data = huge_amount_of_data().
pool = multiprocessing.Pool(processes=cpu_cores) # cpu_cores is set to 8, since my cpu has 8 cores.
pool.map(start_process, data_chunk) # data_chunk is a subset data.
Run Code Online (Sandbox Code Playgroud)
我理解启动这个脚本是一个自己的过程,即在所有子过程完成后完成的主过程。显然 Main 进程不会消耗太多资源,因为它首先只会准备数据并生成子进程。它也会使用自己的核心吗?意思是只能启动 7 个子进程,而不是我喜欢在上面启动的 8 个子进程?
核心问题是:我可以生成 8 个子进程并确保它们可以正确并行工作吗?
顺便说一下,子进程之间不以任何方式交互,当它们完成时,它们各自生成一个存储结果的 sqlite 数据库文件。所以即使是 result_storage 也是分开处理的。
我想避免的是,我生成了一个会阻碍其他进程全速运行的进程。我需要代码在大约 16 小时内终止,而不是在两倍的时间内终止,因为我有更多的进程而不是内核。:-)
目前我以这种方式查询我的数据库:
for author in session.query(Author).filter(Author.queried==0).slice(0, 1000):
print "Processing:", author
# do stuff and commit later on
Run Code Online (Sandbox Code Playgroud)
这意味着每1000个作者我必须重新启动脚本.
是否有可能使脚本无限运行(或者只要有作者)?我的意思是,如果有可能转向
session.query(Author).filter(Author.queried==0).slice(0, 1000)
Run Code Online (Sandbox Code Playgroud)
进入某种生成器,产生下一个作者queried==0是真的.