2023-08
16

少一次连接提一次速度

By xrspook @ 8:29:47 归类于: 烂日记

周二中午去吃饭的时候,我突然意识到之前我用VBA+ADO+SQL做跨表查询的时候,把条件参数也当作是一个表。起码在PQ和PP方案里是这样的。在python方案里,我没有把条件参数作为第三个表,我只是直接把数据从Excel的单元格里读取,然后赋值给一个变量,在以后的各种比较之中用。 python的变量相对于VBA来说实在是太自由了,除非是列表元组字典之类要先定义,然后再用,其它都是拿起来就干,不管他什么格式,日期也好,字符串也好,数值也好,都无所谓。之前我之所以没有在VBA+ADO+SQL里把几个日期参数作为变量是因为我不知道如何在字符串形式的SQL里加入变量,正如一开始的时候,我不知道该如何让让下一个SQL用上一个SQL的结果,但现在我已经用得很顺畅了,整个流程下来,我要引用好多遍,有些是引用上一行的,有些是引用好久好久之前的,说白了就是双引号加&加变量加&再加双引号,等于是把变量以外的东西用双引号括起来。所以既然上一个SQL查询可以这么用,为什么我的那些固定参数就不可以这么用呢。显然在VBA里,要把某个工作簿某个工作表的某个单元格数据变成变量实在太简单了。唯一的问题可能是Excel读取那个单元格的数据,那个数据的格式可能跟我料想的不太一样。比如有时Excel觉得那是一个字符串,但有时Excel又觉得那是一个日期,明明某个数据就是一个整数,但是Excel识别出来经过SQL之后直接生成的那个,Excel觉得那个东西是日期。我不知道Excel到底是怎么想的,但是Excel的单元格毕竟不是一个数据库,不像PQ那样,进到PQ里面,如果你得在某些列进行运算处理的话,你就得定义它为你的目标格式而不能让系统默认成为它们觉得的样子。

吃过午饭后我就赶紧去验证我的想法,结果如我所料,那些变量的确能直接通过拼接的方式加到 SQL的查询字符串里,但是拼接的方式又有点出乎我的意料。比如单元格数据读取能识别到那是一个日期,那个变量在本地窗口显示,那就是一个日期,因为那个数据左右是有#的,但问题是当我要把那个数据跟SQL查询里从表获取的其它数据比较的时候怎么比怎么不对劲。之前当我把那个条件参数作为一个表跟其它表的某些字段比较的时候,两个字段我都加了CDate这个公式,也就是我强行把他们可能觉得是字符串的东西转成日期,然后对比。把日期变量放到SQL字符串里连接符都对了,但是就是得不到我想要的结果。在调试过程中我看了一下系统识别到的那个字符串,结果发现虽然那个明明是日期,但是连接上去以后居然就变成了一个不知道该如何称呼的东西。不能说是数值,不是日期也不是字符串,所以我在双引号的之前之后又加了#,让这个四不像的日期在系统的解释之后成为真正的日期,然后再跟其它表的日期字段比较。除了日期变量以外,我的参数还有字符串。字符串变量情况跟日期很相似,所以我做的是在双引号的前后加上单引号。这样的话,经过系统的解释这就是一个一本正经的字符串了。为什么我不在读取单元格数据的时候直接在那个变量前后加#或者单引号呢?因为我发现这般操作跟在写SQL的时候再加#或者单引号相比前者耗时更长。这其中的原理我不懂。

最终,当我的跨表查询从三表变成两表,第三个表的那些内容改成直接赋值以后,整个程序的运行时间马上提升了0.3秒(效率提高30%)。这是一个了了不起的成绩。对老手来说,理论上一开始就应该这么干,我一开始也曾经试过,但当时我实在不知道该如何把字符串拼接上去。

VBA是个很成熟的东西,SQL也是一个很成熟的东西,但是当要在Excel的VBA里玩SQL的时候,可直接借鉴的经验真的少之又少,但这种摸着石头过河的感觉挺好,虽然已经让我到达了某种废寝忘食的程度了。

2023-08
14

如果直接在python里录入……

By xrspook @ 10:35:55 归类于: 烂日记

见识过VBA+ADO+SQL的威力以后,我马上觉得估计后好长时间我都会用这个了,虽然相对于python来说真的各种不顺手,但是出来的那种效果和效率实在让人着迷,尤其是如果我需要关联更多表格。

VBA跟python相比,我觉得最明显的区别在于打开一个VBA查询Excel文件,我就可以直接在那里设定参数,然后点一个按钮就可以查询,但如果那是python,我还得先打开Excel文件设定数据,关闭文件,然后运行python。当然,实际上在VBA之前我也有考虑过把参数设置这一条在python里解决。这就意味着我得先设定一些预制参数,然后进行一些判断循环,接着把那个参数固定下来,最后继续进行之前我已经在做的事情。说白了就是把参数设定在文件里面的那些东西变成纯粹通过python输入框完成。这实际上也没有什么很大的问题。

python参数录入到底要依据一个怎么样的程序呢?还有就是我怎么判断输入的那些东西的格式一定符合我参数的要求。首先我想的是应该怎么输入,接下来是可能输入的时候有手误。我想到了以前手机话费充值的时候会如果是什么业务就按什么数字,按完这些数字键以后,再按什么井号键结束。我可以把需要录入的参数分别设定不同的数字。每次输入完毕以后就把所有参数打印出来,然后再次询问到底是要继续修改参数还是结束。如果继续修改参数,就继续按某个某些数字,如果结束就按某些特殊的字符。就逻辑来说,如果一次只修改一个参数的话,出错的概率会低一点,但如果说比较省事,理论上应该可以允许批量输入,参数与参数之间以某些约定的符号分开,但是如果我是批量输入参数的话,我怎么确定到底对应的是什么参数呢?还有一个就是参数之间的分隔符也是一个关注的点。中文输入法和英文输入法默认的全角和半角符号是不一样的。要输入者标准地输入那些分隔符,显然也是一个不太容易的事情。如果出错的几率很高,那么这个输入就是一个非常寂寞的行为了。折腾这么一大轮,好处就是在运行拜访之前,不需要先打开Excel文件输入,但是python的这个参数输入相对于直接在Excel文件里面输入又非常麻烦。所以这个先不打开文件,到底是简化程序了还是纯粹是在用python秀肌肉呢?这个秀肌肉我也说不准到底是肌肉还是骨头。简单来说就是把简单的事情复杂化了。当然,如果python能实现一个直接弹出一个参数窗口,你要修改你就修改,不修改就保留原值,这个就比较合理,但好像暂时为止我都没听说过可以这么干。

从编程者的角度考虑,现在已经能实现功能,但是从使用者的角度考虑,或许我还可以更进一步。

2020-11
27

剁手红米Note9 4G

By xrspook @ 14:30:55 归类于: 烂日记

我为自己买东西的时候,哪怕只是个一块钱的小台历,我都要挑来挑去,有时候买一些几毛钱的小东西,我也要折腾半天,比如说买个小漏斗,比如说买个小镊子。但是给我给我爸买了手机的时候,我毫不手软。看到参数,看到那个机子的外观以后,我没纠结,就铁心要买。最后在下单之前,我纠结了一番,烦恼的不是要买什么型号,而是在哪里买。是京东,天猫,还是小米商城?按照以前的习惯,我一定会选小米商城,根本不会有其它选项。但我也知道,小米商城的发货是很神经的,有可能第2天顺丰就到了,也有可能两个星期后才到,即便用的也是顺丰。天猫也是一个说不准的东西,但是京东不一样,京东那里写的是现货,而且他们是有送货时限,昨天下单今天就能送达。在自营商品送货时限这个问题上,京东很可信。如果那个东西是米或者牛奶的话,我或许还得想一想,他们会不会又派一个态度恶劣的快递小哥不帮我妈送上门。但手机这个东西,根本没有这个烦恼。

买我爸的手机之所以能有这么快的决定,是因为几天前我已经做过功课,研究了一番红米的手机。不知道从什么时候开始,我就知道昨天是红米Note9的发布会,到底三剑客是什么,我没有去纠结,也没有特意去搜索小道消息。但之前我的确研究了一番红米的手机,因为我知道我爸的手机要换了,他现在用的是红米Note4X的3+16GB。3GB的运存,用起来其实还行,但16GB的内存实在让人太抓狂了。我还记得在帮我爸买那台手机之前,我买的小米、红米手机全部都是可以加内存卡的,加内存卡和用手机自己的内存唯一的区别是加了卡会慢一点,但不会有东西实际上不能放在卡上,所以加卡进去等于是只能存图片或者视频。红米Note4X是一个一代机神,CPU很牛逼,内存很牛逼,电池也很牛逼,唯一我失策的是完全没想到内存卡在那台手机上是根本没用的,所以16GB的内存简直没法过日子。就当时的情况来说,其实还没到没法过日子的地步,但是随着时间的推移,这就显得非常着急。我已经不记得那台手机的电池是多大的,反正记忆之中不小,而且那一台机可以升级到MIUI 11,说明性能是很不错的。我不记得那台机能不能升级到MIUI 12了。也正是因为那台机的教训,让我明白到内存必须得够大。

这一次我看中的是红米Note9 4G,我买的是8+128GB。之前我纠结过是6+128还是8+128,网友跟我说,如果不差那点钱的话,必定是8+128。我自己的现在用的红米Note7是6+64,因为当时根本没有128的版本。虽然现在觉得6G的内存运存还行,但实在说不准4年后会是什么个状态。红米Note9 4G的广告号称那台机能挺4年,低度使用可以用4天,中度使用可以用2.5天。我爸的手机不需要很牛逼的CPU,因为他不打游戏,但是因为他会一直看电子书,所以需要大电量。因为他没有清垃圾的习惯,道客巴巴上面的东西下载了一个又一个,所以运存和缓存都得足够大。这台新的红米Note9 4G对我爸来说简直就是绝配,就外观来说也很好看,那是一个侧面的指纹解锁的手机。后置的摄像头是竖列分布,而不像5G版本的浴霸模式。我把之前的红米Note4X是我2017年中买的。现在也已经三年有多了,所以是时候换手机了。

虽然我知道,手机买给我爸的时候,他总是永远是一副臭脸。我从来没想象过到底他内心是不是偷偷乐的,但起码在脸上,他从来都不会高兴地接受我的礼物。

2020-04
22

写得过于简单了吧

By xrspook @ 9:29:12 归类于: 烂日记

我看的那个中文版Think Python 2的第11章,习题几乎可以这么说,没一道题的相关是做对的。有些东西,习题跟现在的Think Python 2英文版不一样,我觉得可能是英文版修正了某些东西。修正完以后,英文版并没有写什么更新说明之类的东西,但即便有,中文版翻译的人翻译完以后大概也不会时刻关注英文版有没有变动。同一道题的关联引用,这种东西怎么可以凭着感觉来呢?第一次遇到的时候,我云里雾里,因为按照中文版的那个说法,在某一章书的习题里根本找不到那个东西,但在我印象中,我的确是做过那些习题,到底是在哪一章书里的呢?另外一个版本的中文版那里的索引做对了。当我回看英文原版的时候,发现他们引用某个习题真的写得超简单,但是那些习题全部都是有超连接的,而且锚点到了某一章书的某个确切位置。所以我看的那个中文版之所以是现在这个样子,是不是因为他只是进行了文字上的翻译,还没有仔细研究那些超链接之类的东西呢?又或者在他翻译的时候,他并不是看着英文电子版,我是看英文纸质或者PDF等没有超链接之类的东西。电子版这种东西最让人觉得舒服的应该是哪怕你不标明是那是哪一章书的习题,你只是说那是习题几,只要你把超链接做上去,一切好办。

我看的那个中文版让我无语,但是英文原版也好不到哪里去。因为英文原版的作者脑洞实在太大,让人不知道如何言表。我觉得变成编程这东西,你得给出一个范围,然后再给出一个参考结果,才能让人有奔头。但是他只叫你这般测试,然后再给出一个参考的脚本。在不看脚本之前,如果我只是运行的脚本,而一开始的时候,我们设定的自定义参数不同,该如何判断读者自己的脚本写得对不对呢?有些参数他们完全可以先给出来,或者你会说,那岂不是成了一个提示。这又不是测验考试,重要的不是结果,而是如何整出那个结果,所以即便给你看到最终结果,你不懂过程,还是折腾不出来。英文原版的作者把那些条件参数写在他的脚本里面,而当你写自己的脚本的时候,你又清楚明白到你必须得设定那些参数,但是应该确定为什么呢?拿不准。这就会进入一个怪圈。首先是读者看着题目,自己解答,解答完以后测试,觉得没问题,打开参考答案运行,因为参数答案的结果跟读者得到的不一样,接着我们还得去仔细研究参考答案到底用了什么参数。然后把那个参数放在我们自己的脚本里再运行。对比两个运行的效果。这不是非常折腾吗?如果没有那个隐藏的参数,读者完全可以自己运行一遍,拿参考答案再运行一遍,对比结果就行了。我们最终要做到的不就是那个结果吗?当然,如果得出结果完全一致以后,还是建议大家再研究一下参考答案跟自己的脚本有什么区别,想一想这些区别会不会导致什么问题。

Think Python 2这本书,不只是习题参数设置很让人迷茫。在某些章节里,写得也不细致,比如说元组那一章。元组这个东西据说在其他编程语言里面是没有的。在介绍元组之前,已经说过字符串、列表以及字典。前面三个东西一个套一个,挺容易理解,但是加了元祖进去以后,世界就变得混沌了。因为列表字典元组这三个东西可以互相组合互相转化。有些可变,有些不可变。有些人可排序,有些无效。要真的说清楚元组,第12章书里面已经说到的东西以及已经举过的例子还不足以解决问题。如果他们不把所有东西都说一遍,起码他们得给我们一个列表。告诉我们这些东西可以控制元组,至于具体的使用方法,大家可以查手册。

或许当我把一整本书都看完以后,我的想法又不是我现在这个了。

2017-08
10

选中红米NOTE 4X

By xrspook @ 9:07:37 归类于: 烂日记

买手机对我来说,每次都是一个纠结的过程。虽然品牌基本不用选择,肯定是小米。如果只是我自己买手机,我肯定已经关注了那个型号的手机好段时间,所以纠结的东西就是什么时候出手,在什么价位的时候出手。如果某个机型一开始我就已经关注了很久,最终出手时间就只有两个因素,一个是我要不要等待下一代的新机出来,这一代降价,还是在这一代刚上市的时候,我就马上去秒杀。还记得小米1小米2的时候的抢机经历。每一次都是固定的时间点坐在电脑前聚精会神的去抢,一开始只是在电脑上抢,后来发现用手机app抢得更快,于是就用手机app去抢.之所以这样,是因为手机app开抢的时间要比电脑客户端早那么30秒左右。就是这30秒足以让你在大批人开始疯抢之前就已经抢到你的心头好。后来显然这些技巧已经被大家发现,小米也再也不用以这种方式力推他们的网上商城,所以用app抢跟在电脑上抢效果一样。再到后来已经不需要抢了,因为一开始他们的发货量就很大。不只是不用抢,另外一个是你抢也没用。

这几天我纠结的是该给我爸买什么手机,因为上周日我实在觉得他的手机慢得我不能忍受。程序慢是一个原因,连屏幕也花屏了,这是我不可忍受的。可以这么说,我爸装app比我还狠,我装了一大堆app都是运动相关的,他装的一大堆app都是新闻和阅读相关的。我装app喜欢把它们放在不同的文件夹里,他装app直接就摊开在一个页面。我向来觉得把所有东西都平铺在一个地方找起来很困难。所以我不喜欢那些总把文件堆满整个电脑桌面的人。找的时候真不知道该去哪里找,或许他们觉得他们用习惯了,但实际上,如果电脑卡机或死机,一个错手就删掉了其中的一些。,如果那些文件还是自动排序的,你根本就不知道删掉的是什么。文件安全保护非常重要。为什么就不能把文件放在别的地方,然后做超链接过来呢?显然,在文件夹里可以用列表或详细信息的方式呈现,比用图标好找多了。因为你可以做各种排序,可以是文件名的,也可以是修改时间的,甚至可以是文件类型。但是如果把一大摊东西以不规则的方式排列在桌面上,基本上你用不了这些招,但其实你也能用这一招,只要你打开桌面的文件夹就可以了,但问题是那些人摆了一桌面的人不会知道如何打开桌面的文件夹。

跑得有点远,回到买手机的话题上。我默认给我爸买的是红米,因为他的手机根本不是用来通话的,而是用来看各种东西的,所以与其说那是一个手机,不如说那是一个多媒体的智能终端。我在红米4X和红米NOTE 4X之间纠结。从性能配置上说,红米NOTE 4X要比红米4X要好。但配置好了,另外一个问题肯定是价格贵。就在我纠结要不要买3G+32G的红米4X时候我发现了一个红米NOTE 4X 3G+16G的版本。那是我在红米NOTE 4X的参数页面看到的,官方称之为超值版,另外还有标准版和高端版。超值版已经在小米官网买不到,天猫也没有,唯独京东有,京东把那个版本称作为特供版。本来这个配置官方价只需799,但因为变成了特供版,其它地方都没有卖,一个多月前仍然是799,但到我昨天看的时候已经升价为899。但即便这样,我还是选择了这个版本,因为我知道现在的手机闪存3G才能正常流畅,尤其我爸是那种喜欢开一大堆东西又不关的人。至于内存只有16G,这是个问题,但是手机配套的卡槽是三选二代,如果只放了一个手机卡,另外一个可以放内存卡。于是,这就能解决手机内存不够的问题,内存卡即便你买32G也没多少钱。

今天手机就会到,估计我又得花一段时间去研究那新玩具了。

归档:2017-08-10 Fanaa

© 2004 - 2024 我的天 | Theme by xrspook | Power by WordPress