Это не совсем корректно, чтобы сказать, что компилятор не может оптимизировать далеко копию временной переменной в постфиксном случае. Быстрый тест с VC показывает, что это, по крайней мере, может сделать это в определенных случаях.
В следующем примере, сгенерированный код идентичен для префикса и постфикса, например:
#include <stdio.h>
class Foo
{
public:
Foo() { myData=0; }
Foo(const Foo &rhs) { myData=rhs.myData; }
const Foo& operator++()
{
this->myData++;
return *this;
}
const Foo operator++(int)
{
Foo tmp(*this);
this->myData++;
return tmp;
}
int GetData() { return myData; }
private:
int myData;
};
int main(int argc, char* argv[])
{
Foo testFoo;
int count;
printf("Enter loop count: ");
scanf("%d", &count);
for(int i=0; i<count; i++)
{
testFoo++;
}
printf("Value: %d\n", testFoo.GetData());
}
, Делаете ли Вы ++ testFoo или testFoo ++, Вы все еще получите тот же получающийся код. На самом деле, не читая количество в от пользователя, оптимизатор снизил все это к константе. Так это:
for(int i=0; i<10; i++)
{
testFoo++;
}
printf("Value: %d\n", testFoo.GetData());
Привел к следующему:
00401000 push 0Ah
00401002 push offset string "Value: %d\n" (402104h)
00401007 call dword ptr [__imp__printf (4020A0h)]
Поэтому, в то время как, конечно, имеет место, что постфиксная версия могла быть медленнее, может случиться так, что оптимизатор будет достаточно хорош для избавлений от временной копии, если Вы не будете использовать его.
import operator:
def sortByColumn(bigList, *args)
bigList.sort(key=operator.itemgetter(*args)) # sorts the list in place
Это будет отсортировано по столбцам 2 и 3:
a.sort(key=operator.itemgetter(2,3))
Ключевая идея здесь (каламбур) заключается в использовании ключевой функции, возвращающей кортеж.
Ниже ключевой функцией является лямбда x: (x [idx] для idx в args)
x
устанавливается равным элементу aList, то есть строке данных. Он возвращает набор значений, а не только одно значение. Метод sort () сортирует в соответствии с первым элементом списка, затем прерывает связь со вторым и так далее. См. http://wiki.python.org/moin/HowTo/Sorting#Sortingbykeys
#!/usr/bin/env python
import csv
def sortByColumn(aList,*args):
aList.sort(key=lambda x: (x[idx] for idx in args))
return aList
filename='file.txt'
def convert_ints(astr):
try:
return int(astr)
except ValueError:
return astr
biglist=[[convert_ints(elt) for elt in line]
for line in csv.reader(open(filename,'r'),delimiter='\t')]
for row in sortByColumn(biglist,0):
print row
for row in sortByColumn(biglist,2,3):
print row
Убедитесь, что вы преобразовали числа в целые, иначе они будут отсортированы по алфавиту, а не по числовому.
# Sort the list in place
def sortByColumn(A,*args):
import operator
A.sort(key=operator.itemgetter(*args))
return A
или
# Leave the original list alone and return a new sorted one
def sortByColumn(A,*args):
import opertator
return sorted(A,key=operator.itemgetter(*args))