我正在尝试编写一个需要大量加密强度伪随机字节的应用程序.
RC4密码对此非常理想; 它的重量轻,易于理解.所以,我得到了规范并用Python编写了一个RC4算法.
它完全按预期工作,但是,它像糖蜜一样慢.在我的Core i7 2.2GHz上,我只能从算法中获得大约1MB /秒的速度.
很明显,Python的解释性质并不是最适合这类任务的.我的问题是我不熟悉C编码 - 我用C做的最好的是一些Hello World的东西和一些文件读写的实验.无论哪种方式,我对C使用Python-C API肯定不够好.
我知道.NET/C#,我在Windows上用C#编写了相同的算法,并且我能够轻松地超过60MB /秒.所以.NET的CLR更加优化.但是,Python应用程序的目标平台是Unix/Linux.
理想情况下,我不想通过大量的中间层来获得优化的RC4密码到Python应用程序中.
由于RC4依赖于状态,理想情况下我会用类来做(这就是我用Python实现的方式.)所以,这里是我想要做的一小部分:
rc4 = RC4Encrypter()
rc4.seed(myKey) # seed the RC4 algorithm with bytes from string myKey
rc4.getRC4Bytes(1048576) # get the next 1MB of RC4 cryptostream bytes as a binary string
rc4.encryptWithRC4(myString) # encrypt myString's bytes with RC4 bytes using xor and return
Run Code Online (Sandbox Code Playgroud)
有什么建议?我很想学习C,但对于这个简单的项目来说,这是一个很大的学习曲线.
样本:
d = {
"test": 1,
"sample": 2,
"example": 3,
"product": 4,
"software": 5,
"demo": 6,
}
filter_keys = ["test","sample","example","demo"]
Run Code Online (Sandbox Code Playgroud)
我想创建一个新的字典,它只包含第一个字典中键出现在列表中的那些项目。换句话说,我想要:
d2 = {
"test": 1,
"sample": 2,
"example": 3,
"demo": 6,
}
Run Code Online (Sandbox Code Playgroud)
我可以用一个循环来做到这一点:
d2 = {}
for k in d.keys():
if (k in filter_keys):
d2[k] = d[k]
Run Code Online (Sandbox Code Playgroud)
但这似乎非常“非 Pythonic”。我还猜测,如果您有一个巨大的 dict,比如说 5,000 个左右的项目,与更直接的方式相比,向新 dict 不断添加新项目会很慢。
此外,您还希望能够处理错误。如果列表包含不是字典中的键的内容,则应该忽略它。或者它可能被添加到新的字典中,但值为 None。
有没有更好的方法来实现这一点?
游戏中的场景是我有一个有序的项目列表.我想将该列表转换为单个字符串.
然而.
这不仅仅是将每个项目转换为字符串并连接的问题.作为转换的一部分,我需要在列表上进行一些处理.
这是一个粗略的例子:
列表:
[1,
2,
3,
0,
1,
9,
-4,
3,
2]
Run Code Online (Sandbox Code Playgroud)
我想要的输出是这样的:
The total of a group is 6.
The total of a group is 10.
The total of a group is 5.
Run Code Online (Sandbox Code Playgroud)
这是我写的代码可以做到这一点:
total = 0
result = ""
for item in myList:
if (item <= 0):
result += "The total of a group is %d.\n" % total
total = 0
continue
total += item
# NOTICE THE CODE DUPLICATION HERE...
result += "The total of …Run Code Online (Sandbox Code Playgroud) 我正在使用一个使用out参数的函数的API .我想out在while循环中使用其中一个参数中的值.例如:
static int counter = 0;
static void getCounterValue(out int val)
{
val = counter;
counter++;
}
static void Main()
{
// Right now, I'm having to do this:
int checkVal = 0; // I have to figure out an appropriate starting value.
while (checkVal < 10)
{
getCounterValue(out checkVal);
Console.WriteLine("Still waiting.");
}
Console.WriteLine("Done.");
}
Run Code Online (Sandbox Code Playgroud)
有没有更简单的语法来做到这一点?我想要更经典的东西while (getCounterValue() < 10),但我必须处理out参数,因为它是一个我无法改变的API.
我的问题与我在网上找到的每个问题完全相反.
我想在Resharper中启用 C#7.0警告/错误(在VS2017中运行,今天刚安装的版本.)
我需要这样做,因为我正在处理的项目将发布到我的工作场所的服务器,当使用C#7.0功能时,他们的CI会抛出致命错误R# C# 7.0 language feature,因此我无法使用它们(他们不会接受任何项目他们的CI失败了.)
他们在CI中使用Resharper CLI.所以我想让我的Resharper抛出相同的错误,这样我就可以快速找到并消除C#7.0的功能.我的Resharper显示项目是干净的(除了一些小的"它可能是一个问题,但它不适合我"),所以当我运行代码分析时,我没有致命的错误甚至是关于C#7.0的警告.
到目前为止我遇到的每个问题都是询问如何禁用有关C#7.0的警告.我的Resharper没有发出任何警告或错误,而我们的CI则是.
我查看了选项,但找不到任何明显的"C#7.0"选项.我找了类似"最大支持语言/抛出错误,如果使用更高版本的语言功能/等",但我似乎无法找到任何东西.
编辑:Web.config codedom部分:
<system.codedom>
<compilers>
<compiler language="c#;cs;csharp" extension=".cs" type="Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" warningLevel="4" compilerOptions="/langversion:6 /nowarn:1659;1699;1701" />
</compilers>
</system.codedom>
Run Code Online (Sandbox Code Playgroud)
它肯定设置为语言版本6 ...
编辑:这是我尝试失败的实际代码:
sounds.py
import audio
import time
localAudioPlayer = None
def Play(soundString, wait=True):
if (localAudioPlayer != None):
localAudioPlayer.stop()
localAudioPlayer = audio.stream("sound/%s.ogg" % soundString)
localAudioPlayer.play()
if (wait == True):
while (localAudioPlayer.playing == True):
time.sleep(0.1)
return
Run Code Online (Sandbox Code Playgroud)
"audio"是我写的一个完整的库(在带有init的文件夹中),允许音频播放.
这里的想法是,如果在声音已经播放的同时调用Play(),则应停止该声音.
我没有我的代码设置,我可以实例化audio.stream()对象,而无需播放实际文件,因此预先初始化它并不是一个好主意.
我尝试了与原始示例类似的代码(我设置stuffLocalVar = None然后在函数中测试它为None)并且它工作正常.所以这是特定代码的特定内容.
当我在Python控制台上"导入声音"并尝试直接执行Play()时,我得到了相同的回溯.
追溯:
>>> sounds2.Play("file.ogg")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "sounds2.py", line 7, in Play
if (localAudioPlayer != None):
UnboundLocalError: local variable 'localAudioPlayer' referenced before assignment
Run Code Online (Sandbox Code Playgroud)
原版的
我不确定这个设置的正确术语,所以让我举个简短的例子:
mainApp.py:
import stuff
print stuff.do() …Run Code Online (Sandbox Code Playgroud) 场景:
我有一个清单:
['item','place','thing']
Run Code Online (Sandbox Code Playgroud)
我有一些字符串:
"item", "item1", "thing55", "place_C", "stuff", "junk5"
Run Code Online (Sandbox Code Playgroud)
在上面,我希望前四个匹配,最后两个不匹配.startswith函数最适合此检查.
(测试字符串"item","item1"等的列表不是python列表;它只是一组可能被检查的样本数据.但是,要匹配"item","place"的字符串列表,"thing"是代码中的python列表.)
我可以遍历第一个列表并将字符串与startswith进行比较:
successVar = False
for s in myStrings:
if (testString.startswith(s)):
successVar = True
break
# Now you would check successVar to decide if string matched
Run Code Online (Sandbox Code Playgroud)
但在所有情况下,这并不一定最好.例如,假设这是if/elif结构的一部分:
if (testString == "hello"):
# do something based on exact string match
elif (testString.endswith("!")):
# do something if string ends with _one_ specific entity
elif <somehow, do the above comparison in here>
# do something if string starts with any of the …Run Code Online (Sandbox Code Playgroud) python ×5
list ×2
c# ×1
c#-7.0 ×1
dictionary ×1
encryption ×1
module ×1
rc4-cipher ×1
resharper ×1
structure ×1