Узнал через несколько дней что файлы с типами принято называть с окончанием .d.ts.
create table part (i int) partition by hash (i);
create table part_0 partition of part FOR VALUES WITH (MODULUS 2, REMAINDER 0);
create table part_1 partition of part FOR VALUES WITH (MODULUS 2, REMAINDER 1);
insert into part select generate_series(1,10);
select * from only part_0;
select * from only part_1;
- if (e.keycode === 13) {
+ if (e.keyCode === 13) {
Тая Зотова учу javascriptОдно из важнейших, чему стоит научиться в первую очередь - отладка своего кода.
Сложно ли писать ботов на плюсах?
Есть ли видео курсы, литература на эту тему?
Какие есть библиотеки?
Чем отличается программирование тг ботов на с++ и на других яп, скажем питоне?
mod m01;
mod m02;
mod m03;
fn main() {
m01::f1();
m02::f2();
let (i, p) = m03::f3();
println!("i = {:?}", i);
println!("p = {:?}", p);
}
pub fn f1() {
let num: u8 = 12;
println!("num = {:?}", num);
}
pub fn f2() {
let s: String = "abc".to_string();
println!("s = {:?}", s);
}
pub fn f3() -> (u8, String) {
let i: u8 = 88;
let p: String = "xyz".to_string();
(i, p)
}
macro_rules! f4 {
() => {
let i: u8 = 88;
let p: String = "xyz".to_string();
}
}
macro_rules! f4 {
($a: ident, $b: ident) => {
let $a: u8 = 88;
let $b: String = "xyz".to_string();
}
}
fn main() {
f4!(i, p);
println!("{} {}", i, p);
}
1 - есть ли что-то быстрее, чем tokio
2 - правильно ли я использую tokio
3 - насколько хорошая с точки зрения производительности идея использовать Arc
4 - можно ли ускорить саму по себе структуру HashMap или только переписывать?
pub struct DashMap<K, V, S = RandomState> {
shift: usize,
shards: Box<[RwLock<HashMap<K, V, S>>]>,
hasher: S,
}
hashmap_no_capacity_format_key__3M
time: [1.4810 s 1.5362 s 1.5952 s]
hashmap_set_capacity_format_key__3M
time: [1.0688 s 1.0744 s 1.0804 s]
btree_format_key__3M time: [754.93 ms 843.10 ms 933.95 ms]
vec_set_apacity__3M time: [1.7122 ms 1.7309 ms 1.7655 ms]
dashmap_rayon_format_key__3M
time: [294.76 ms 303.70 ms 316.85 ms]
btree_known_key__3M time: [554.56 ms 556.18 ms 558.41 ms]
use std::{
collections::{BTreeMap, HashMap},
time::Instant,
};
use criterion::{black_box, criterion_group, criterion_main, Criterion};
fn hashmap_no_capacity_format_key(n: usize) -> HashMap<String, usize> {
let mut map = HashMap::new();
for i in 0..n {
let key = format!("key_{i}");
map.insert(key, i);
}
map
}
fn hashmap_set_capacity_format_key(n: usize) -> HashMap<String, usize> {
let mut map = HashMap::with_capacity(n + 1);
for i in 0..n {
let key = format!("key_{i}");
map.insert(key, i);
}
map
}
fn btreemap_format_key(n: usize) -> BTreeMap<String, usize> {
let mut map = BTreeMap::new();
for i in 0..n {
let key = format!("key_{i}");
map.insert(key, i);
}
map
}
fn vec_set_capacity(n: usize) -> Vec<usize> {
let mut vector = Vec::with_capacity(n);
for i in 0..n {
vector.push(i);
}
vector
}
fn btreemap_known_key(keys: impl Iterator<Item = (String, usize)>) -> usize {
let mut map = BTreeMap::new();
for (k, v) in keys {
map.insert(k, v);
}
map.len()
}
fn dashmap_rayon_format_key(n: usize) -> dashmap::DashMap<String, usize> {
use rayon::prelude::*;
let map = dashmap::DashMap::with_capacity(n);
(0..n).into_par_iter().for_each(|i| {
let key = format!("key_{i}");
map.insert(key, i);
});
map
}
fn bench(c: &mut Criterion) {
c.bench_function("hashmap_no_capacity_format_key__3M", |b| {
b.iter(|| hashmap_no_capacity_format_key(black_box(3_000_000)))
});
c.bench_function("hashmap_set_capacity_format_key__3M", |b| {
b.iter(|| hashmap_set_capacity_format_key(black_box(3_000_000)))
});
c.bench_function("btree_format_key__3M", |b| {
b.iter(|| btreemap_format_key(black_box(3_000_000)))
});
c.bench_function("vec_set_apacity__3M", |b| {
b.iter(|| vec_set_capacity(black_box(3_000_000)))
});
c.bench_function("dashmap_rayon_format_key__3M", |b| {
b.iter(|| dashmap_rayon_format_key(black_box(3_000_000)))
});
c.bench_function("btree_known_key__3M", |b| {
b.iter_custom(|times| {
let mut total = vec![];
for _ in 0..times {
let mut keys = Vec::with_capacity(3_000_000);
for i in 0..3_000_000 {
keys.push((format!("key_{i}"), i));
}
let start = Instant::now();
black_box(btreemap_known_key(black_box(keys.drain(..))));
total.push(start.elapsed());
}
total.iter().sum()
});
});
}
criterion_group! {
name = benches;
config = Criterion::default().sample_size(10);
targets = bench
}
criterion_main!(benches);
import typing as tp
class Test:
@tp.overload
def __init__(self, x: int, y: str):
... # тут не должно быть тела!
@tp.overload
def __init__(self, other: 'Test'):
... # typehint в виде строки, так как класс Test еще не создан. Тела нет!
def __init__(self, *args, **kwargs): # настоящий конструктор
# определяем, как нас вызвали
if 'other' in kwargs:
first_arg = kwargs['other']
x, y = first_arg.x, first_arg.y
elif 'x' in kwargs:
x, y = kwargs.get('x'), kwargs.get('y')
elif isinstance(args[0], Test):
x, y = args[0].x, args[0].y
else:
x, y = args[0:2]
self.x: int = x
self.y: str = y
def __repr__(self) -> str:
return f'Test(x={self.x!r}, y={self.y!r})'
# порядковая передача аргументов сработает
t1 = Test(1, 'foo')
t2 = Test(t1)
print(t1, t2)
# именованная передача аргументов сработает
t3 = Test(x=2, y='bar')
t4 = Test(other=t3)
print(t3, t4)
Test(3, y='baz') # а вот это сломается...
fn main() {
let funcs = {
// Можно использовать не FnOnce, а что-то другое. Например Fn или FnMut. Но в любом случае придётся использовать dyn, тк наша лямбда берёт что-то из окружающего контекста.
let mut funcs: Vec<Box<dyn FnOnce() -> usize>> = Vec::with_capacity(3);
for i in 0..3 {
let i_copy = i.clone(); // вообще clone() тут не нужен, тк usize реализует трейт Copy. Оставлено для примера
funcs.push(Box::new(move || i_copy));
}
funcs
};
for func in funcs {
let result = func();
println!("{result}");
}
}
#[derive(Copy, Clone, Debug)]
struct Something(usize);
impl Something {
fn value(&self) -> usize {
self.0
}
}
fn main() {
let items = {
let mut items = Vec::with_capacity(3);
for i in 0..3 {
items.push(Something(i));
}
items
};
for item in items {
let result = item.value();
println!("{result}");
}
}